Два оператора synchronized (this)
ссылаются на Runnable
анонимные классы.
Таким образом, синхронизация двух экземпляров Runnable
не работает на одной и той же блокировке.
Необходимо выполнить синхронизацию с экземпляром внешнего класса, чтобы заблокировать тот же монитор, например:
synchronized (Test.this) {...}
Кроме того, обратите внимание, что с помощью лямбды для реализации функционального интерфейса Runnable
, такого как:
var writer = () -> {
synchronized (this) {
System.out.println("condition is set to true");
condition = true;
}
};
Вы можете сохранить фактический синтаксис (synchronized (this)
) как this
, в этом случае не ссылается на анонимный класс, который не существует, но ссылается на внешний экземпляр.