fix: ensure thread-safe visibility in livelock example

This commit is contained in:
user
2026-09-02 16:26:03 +04:00
parent def8f1b78d
commit 4038de6135
@@ -13,14 +13,18 @@ public class LiveLock {
currentPerson = person; currentPerson = person;
} }
public synchronized Person getPerson() {
return currentPerson;
}
public synchronized void pass() { public synchronized void pass() {
System.out.printf("%s прошёл по коридору!%n", currentPerson.name); System.out.printf("%s прошёл по коридору!%n", currentPerson.name);
} }
} }
static class Person { static class Person {
private String name; private final String name;
private boolean wantsToPass; private volatile boolean wantsToPass;
public Person(String personName) { public Person(String personName) {
name = personName; name = personName;
@@ -40,11 +44,12 @@ public class LiveLock {
// Если сейчас право пройти принадлежит другому человеку, // Если сейчас право пройти принадлежит другому человеку,
// немного ждём и снова проверяем ситуацию. // немного ждём и снова проверяем ситуацию.
if (corridor.currentPerson != this) { if (corridor.getPerson() != this) {
try { try {
Thread.sleep(1); Thread.sleep(1);
} catch (InterruptedException e) { } catch (InterruptedException e) {
continue; Thread.currentThread().interrupt();
return;
} }
continue; continue;
} }
@@ -81,6 +86,7 @@ public class LiveLock {
// Первый поток — Иван. // Первый поток — Иван.
new Thread( new Thread(
new Runnable() { new Runnable() {
@Override
public void run() { public void run() {
ivan.walkThrough(corridor, petr); ivan.walkThrough(corridor, petr);
} }
@@ -90,6 +96,7 @@ public class LiveLock {
// Второй поток — Пётр. // Второй поток — Пётр.
new Thread( new Thread(
new Runnable() { new Runnable() {
@Override
public void run() { public void run() {
petr.walkThrough(corridor, ivan); petr.walkThrough(corridor, ivan);
} }