synchronized
означает, что только один поток может одновременно выполнять блок кода. Возможно, вы путаете формулировку, считая, что она синхронизирует переменную.
Когда вы пишете synchronized (this.myBuffer)
, вы говорите программе использовать myBuffer в качестве блокировки при принятии решения, может ли поток выполнить следующий блок кода.
Это означает, что когда поток пытается выполнить synchronized (this.myBuffer) { }
, он попытается получить блокировку myBuffer.
- Если ни один другой поток не имеет блокировки, он получит ее и выполнит блок кода.
- Если другой поток имеет блокировку, он будет ждать, пока другой поток не снимет блокировку (обычно путем завершения выполнения кода внутри блока кода).
Это означает, что все потоки будут всегда по очереди выполняя содержимое synchronized (this.myBuffer) { }
.
Так как поток «Один» запускается первым, он сначала получает блокировку и завершает sh всю работу, которую он имеет, таким образом, увеличивая содержимое myBuffer до D, прежде чем Передача в нить "Два".