Объявите метод синхронизированным, когда вам нужна семантика синхронизированного блока вокруг тела метода.
synchronized void increment() {
...
}
точно так же, как:
void increment() {
synchronized (this) { ... }
}
в приведенном выше коде вы больше не выполняете методы increment()
и getValue()
атомарно: другой поток может подключиться и выполнить методы между вызовами вашего потока:
Thread 1 Thread 2
increment()
increment()
getValue()
getValue()
Thisвозможно, но два потока не могут выполнить increment()
(или getValue()
) одновременно, потому что они синхронизированы (*).
С другой стороны, синхронизация вокруг вызовов, как вКод в вопросе означает, что два вызова выполняются атомарно, поэтому два потока не могут чередоваться:
Thread 1 Thread 2
increment()
getValue()
increment()
getValue()
(*) На самом деле, они оба могут выполнять метод одновременно,Просто все потоки, кроме одного, будут ждать на synchronized (this)
.