(1) Это эквивалентно:
public void method1(){
synchronized (this) {
...
}
}
Так что он синхронизируется на текущем экземпляре. Если мы переписываем method2 таким же образом ...
public void method2(){
synchronized (this) {
...
}
}
... тогда вы можете ясно видеть, что они блокируются на одном и том же объекте, и поэтому другие потоки не могут вызывать method1 или method2, пока method1 не выйдет из своего блока synchronized
.
(2) synchronized
блоки являются входящими, это означает, что один и тот же поток может вводить другие блоки synchronized
, которые блокируют один и тот же объект столько раз, сколько он хочет. Насколько я понимаю, каждый раз, когда вы входите в блок synchronized
, Java увеличивает счетчик объекта, с которым вы синхронизируете, на 1, и каждый раз, когда вы выходите из блока synchronized
, он уменьшает его. Когда этот счетчик достигает 0, блокировка снимается.