2016-07-15 2 views
0

Фрагмент кода, как показано ниже:почему синхронизируется объект все еще можно манипулировать

List<String> list = new ArrayList<>(); 

public void addValue(int i) { 
    synchronized (list) { 
     list.add("list" + i); 
    } 
} 

Мой вопрос заключается в том, что то, что заблокирован по ключевому слову synchronized.
Что будет проверено на list, когда два потока попросят выполнить блок кода?
Тот же вопрос, что я синхронизировал this, но его поля все еще можно изменить.

ответ

0

Синхронизированный блок заблокирован. Когда код запускается, поток не блокирует объект, вместо этого он блокирует объект list, который является словом метки внутри заголовка объекта, поэтому другой поток не может получить одну и ту же блокировку. В результате код внутри блока может выполняться только одним потоком одновременно.

Смежные вопросы