Если методы синхронизируются на одном мониторе, они не могут выполняться одновременно в разных потоках.Когда второй поток приходит к записи монитора (в этом случае запускается синхронизированный метод), он блокируется до тех пор, пока первый поток не освободит монитор.
Фактическое состояние заблокированного потока в этом случае, так как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
в моем случае гипотетического именования), поэтому не будут блокироваться любыми вызовами методов экземпляра.