Если методы синхронизированы на одном мониторе, то они не могут выполнять одновременно в разных потоках. Когда второй поток приходит к записи монитора (в этом случае запуск синхронизированного метода), он будет блокироваться до тех пор, пока первый поток не отпустит монитор.
Фактическое состояние заблокированного потока в этом случае, как сообщает JConsole, будет что-то вроде java.lang.Thread.State: WAITING (on object monitor)
Предполагая, что все методы являются нормальными методами экземпляра, то они будут один и тот же монитор при вызове на том же объект.То есть, если у вас что-то вроде:
// Thread 1
A a1 = new A();
a1.m1();
// Thread 2
A a2 = new A();
a2.m2()
, то в этом случае, второй поток будет иметь возможность вызвать метод, поскольку он пытается получить неявный монитор от a2
объекта, который не заблокирован нитью 1. Но если поток 2 попытался вызвать a1.m2()
, то он блокируется до тех пор, пока нить 1 не закончит выполнение m1()
.
Если у вас есть статические методы, то они получают явный монитор самого класса (A.class
в моем гипотетическом-именовании случае), так что не будет блокироваться любых метод экземпляра заклятий.
но если мы сделаем что-то подобное, то что? final Test tt1 = new Test(); final Test tt2 = new Test(); Тема: t1 = new Thread() {public void run() {tt1.m1(); }}; Тема t2 = new Thread() {public void run() {tt2.m2(); }}; – Prem
Я запускаю то же самое, и я получил TIMED_WAIT как результат .... – Prem
@aioobe что происходит в случае синхронизированных блоков кода (а не методов). может ли два потока получить доступ к двум различным синхронизированным кодовым блокам одного и того же объекта одновременно? – yuva