Почему интерфейсы java collection (s) не синхронизированы? [Дубликат]

Вы используете массив как объект, разница между getElementbyId и getElementsByClassName такова:

  • getElementbyId вернет вам объект.
  • getElementsByClassName вернет вам массив.

getElementsByClassName

Метод getElementsByClassName(classNames) принимает строку, содержащую неупорядоченный набор уникальных разделенных пробелами маркеры, представляющие классы. При вызове метод должен возвращать живой объект NodeList, содержащий все элементы документа, которые имеют все классы, указанные в этом аргументе, получив классы, разделив строку на пробелы. Если в аргументе нет токенов, тогда метод должен возвращать пустой NodeList.

blockquote>

https://www.w3.org/TR/2008/WD-html5 -20080610 / dom.html # getelementsbyclassname

getElementById

Метод getElementById () обращается к первому элементу с указанным id.

blockquote>

http://www.w3schools.com/jsref/met_doc_getelementbyid.asp

в вашем коде строки:

1- document.getElementsByClassName ('myElement'). Style.size = '100px';

blockquote>

НЕ будет работать, как ожидалось, потому что getElementByClassName вернет массив, и массив будет НЕ имеет свойство style, вы будете обращаться к каждому element, итерации их.

Вот почему функция getElementById работает на вас, эта функция вернет вам прямой объект, и поэтому вы сможет получить доступ к свойству style.

1
задан FreakinOutMan 20 June 2012 в 19:04
поделиться

3 ответа

Разве я не отвлекаю немного от моего приложения в обмен на небольшую скорость?

Если ваша единственная защита потоковой передачи основана на синхронизации из Vector и Hashtable, вы почти наверняка испытываете проблемы.

Обычно операции с крупнозернистыми данными необходимо синхронизировать - «синхронизировать каждую небольшую операцию с коллекциями и надеяться, что это достаточно хорошо» подход почти никогда не требуется, поэтому зачем брать его с небольшим ударом?

Если вы делитесь изменяемыми данными (например, коллекциями) между потоками, вам нужно подумать о том, как это сделать - использование Vector и Hashtable может дать вам ложное чувство безопасности.

11
ответ дан Jon Skeet 21 August 2018 в 09:18
поделиться

Я не уверен на 100%, что вы получаете «безопасность», которая, по вашему мнению, вы есть. Я обычно обнаружил, что хочу сам синхронизировать, а не полагаться на встроенный материал (будь то Vector / Hashtable или Collections.synchronizedList (новый ArrayList ()) / Collections.synchronizedMap (новый HashMap ())) .

Я предпочитаю создавать свои собственные блокирующие мониторы и контролировать все блокировки. Если я этого не делаю, я, как правило, забываю блокировать сложные, многоступенчатые операции и не замечать этого. Мне нравится, как это заставляет вас задуматься о блокировке в вашей системе - иначе становится легко «чувствовать» себя в безопасности, когда на самом деле вы этого не делаете. Блокировка - это то, что действительно может испортить вас и быть гнездом ошибок, если вы не сделаете это правильно. Стоит задуматься о блокировке в том месте, где это необходимо, и понять, как ваша блокировка защищает доступ.

1
ответ дан Chris Boran 21 August 2018 в 09:18
поделиться

synchronized несет существенный штраф за производительность и часто не является лучшим подходом к параллелизму.

Если вам нужны потокобезопасные коллекции, используйте те, что указаны в java.util.concurrent.

Эта статья может быть полезной.

2
ответ дан missingfaktor 21 August 2018 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: