У меня есть два потока thread_1 и thread_2 , вызывающие разные методы для одного и того же объекта unsafeObj .
- thread_1 звонки
unsafeObj.incrementVAR_v1()
10 раз - thread_2 звонки
unsafeObj.incrementVAR_v2()
10 раз
Оба эти метода экземпляра имеют synchronized
-блок с различными блокировками (LOCK_1 и LOCK_2) , обращающимися к одному и тому же полю экземпляра VAR .
public void icrementVAR_v1() {
synchronized(LOCK_1) {
++VAR;
print("Thread 1: " + VAR)
}
}
public void incrementVAR_v2() {
synchronized(LOCK_2) {
++VAR;
print("Thread 2: " + VAR);
}
}
? Учитывая, что эти два synchronized
-блока используют разные блокировки, я бы ожидал одновременного доступа к VAR
, что приведет к потере обновлений (VAR
меньше 20).Это, однако, не то, что я наблюдаю.Может кто-нибудь объяснить мне, почему это не так?
Пример вывода:
Thread 2: 2
Thread 1: 1
Thread 2: 3
Thread 1: 4
Thread 2: 5
Thread 1: 6
Thread 2: 7
Thread 1: 8
Thread 2: 9
Thread 1: 10
Thread 2: 11
Thread 1: 12
Thread 2: 13
Thread 1: 14
Thread 2: 15
Thread 1: 16
Thread 2: 17
Thread 1: 18
Thread 2: 19
Thread 1: 20