Да, когда вы помечаете методы как synchronized
, тогда вы действительно делаете это:
void method1() {
synchronized (this) {
method2()
}
}
void method2() {
synchronized (this) {
}
}
Когда вызов потока попадает в method2 из метода method1, он гарантирует, что он удерживает блокировку дляthis
, что он уже сделает, и затем он может пройти.
Когда поток попадает непосредственно в method1 или method2, он будет блокироваться, пока не получит блокировку (this
), а затемоно войдет.
Как отметил Джеймс Блэк в комментариях, вы должны знать, что вы делаете внутри тела метода.
private final List<T> data = new ArrayList<T>();
public synchronized void method1() {
for (T item : data) {
// ..
}
}
public void method3() {
data.clear();
}
Внезапно это не безопасно для потока, потому чтовы смотрите на ConcurrentModificationException
в своем будущем, потому что method3
не синхронизирован, и поэтому может вызываться потоком A, пока поток B работает в method1
.