Вы правы, синхронизированные методы блокируют сам экземпляр.Итак, написание следующего:
synchronized myMethod() {
//code
}
По сути, такое же поведение, как если бы вы написали:
myMethod() {
synchronized(this) {
//code
}
}
Обратите внимание, что this
это просто Object
и используется какбудет использоваться блокировка, как и любой другой объект - блокировка может принадлежать только одному потоку за раз, остальные должны ждать, пока он войдет в блок synchronized
, используя тот же объект.Поскольку методы с ключевым словом synchronized
ведут себя таким образом, они совместно используют блокировку, являющуюся самим экземпляром.
Итак, если у вас есть методы increment()
и decrement()
, оба помеченные synchronized
, то тольколюбой из двух может использоваться и одним потоком за раз.
Между тем, другие методы без ключевого слова synchronized
остаются полностью незатронутыми и будут работать одинаково, независимо от того, есть ли синхронизированные методы вокруг них или нет.