еще раз вопрос об ArrayList и синхронизации.
Я просто хотел бы знать, что именно делает этот фрагмент:
ArrayList<ObjectX> list = ....;
synchronized (list) {
if (list.contains(objectxy) == false) {
list.add(objectxy);
}
}
Я получил ArrayList, заполненный объектами ObjectX. Я хочу добавить элемент в список, но только если список не содержит того же элемента. Я проверял раньше (в другом методе), если список действительно содержит объект - результат был нет. Но возможно, что два потока одновременно считают, что результата нет, и что они оба пытаются затем добавить объектную область. (Есть некоторые другие вещи, которые должны быть сделаны между ними, поэтому я не могу синхронизировать весь процесс)
Итак, после процесса и когда теперь потоки попадают в приведенный выше фрагмент, я хочу предотвратить добавление этого объекта в список. Поэтому я подумал, что когда я синхронизирую доступ к списку, только один поток может проверить, содержит ли он объект, а затем добавить его. После этого второй поток может получить доступ к списку, увидеть, что объект уже находится в нем и больше не будет его добавлять.
Вот чего я хочу достичь. Будет ли это работать? : -)
Так что, если да, я хотел бы знать, что именно делает фрагмент. Предотвращает ли два потока одновременный доступ к этому точному коду? чтобы код был доступен только для одного потока одновременно?
Или он блокирует сам список на все время для любого потока в приложении, который в данный момент пытается получить доступ к списку - в любом месте ? (У меня нет других add () в моем коде, но многие get (), поэтому я хотел бы знать, могут ли другие потоки получать доступ к списку и получать элементы, пока другой поток обращается к приведенному выше коду).
Сам ArrayList является переменной-членом, которая связана с принципалом, использующим приложение. Верно, что несколько различных потоков могут одновременно обращаться к приведенному выше коду , если они не отправлены с одного и того же принципала , верно?
Итак, вот что я хотел бы знать. Я старался отмечать свои вопросы, чтобы на них было легче отвечать. Спасибо за помощь! : -)
[РЕДАКТИРОВАТЬ] Спасибо за все ответы, которые почти все сказали то же самое! Я думаю, что теперь понятно! : -)
- синхронизированный кодовый блок может быть доступен только одному из основных потоков. (темы других принципалов не имеют отношения к конкретному принципалу). Сам список может быть доступен в любое время из других потоков - если доступ к нему также не синхронизирован с блоком синхронизации. Если это так, поток должен ждать, пока он не сможет получить доступ к списку (это означает, что ни один другой поток не находится одновременно в синхронизированном блоке)
правильно? Я надеюсь на это: -)