CopyOnWriteArraylist синхронизированных методов
Его метод из CopyOnWriteArrayList.class
public synchronized boolean set(E e) {
Object[] newElements = elements.clone();
@SuppressWarnings("unchecked")
E result = (E) newElements[index];
newElements[index] = e;
elements = newElements;
return result;
}
Хорошо, допустим, у меня есть
final List<MyType> list = new CopyOnWriteArrayList();
и у меня есть метод
public void update(Task task) {
synchronized (tasksList) {
int index = tasksList.indexOf(task);
validateIndex(index);
tasksList.set(index, task);
}
}
Я подумал, чем синхронизировать метод copyOnWriteArrayList "установить" на (это)
В моем методе я заблокировал монитор моего списка (синхронизированный (tasksList)), почему метод работает правильно. Я думал, что строка ( tasksList.set(index, task);) не будет работать, потому что tasksList уже заблокировал строку выше
1 ответ
Решение
Один и тот же поток может вызывать синхронизированный метод внутри него - другой синхронизированный метод в том же экземпляре. Поскольку этот поток владеет монитором, выдает второй вызов не создает.