fix: ensure thread-safe visibility in livelock example
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user