Нет, это не так, обе нити должны пытаться использовать тот же замок, а затем, если Thread A взял блокировку, сначала Thread B будет заблокирован до тех пор, пока A не выпустит его. Блокировка может быть любым объектом, общим для А и В, наиболее типичным для вашего случая является
public class MyClass {
private AnotherClass mField;
public synchronized void changeOne(AnotherClass newOne) {
...
}
public synchronzied void changeTwo(AnotherClass newTwo) {
...
}
в этом случае этот
используется как блокировка. Это эквивалентно (почти)
public void changeOne(AnotherClass newOne) {
synchronized(this) {
...
}
}
public void changeTwo(AnotherClass newOne) {
synchronized(this) {
...
}
}
синхронизированный метод более компактен, тогда как синхронизированный блок более гибкий. С синхронизированным блоком вы блокируете любой объект, в то время как синхронизированный метод блокирует неявно либо на this
, либо для статических методов в классе class
.