Próbuję nauczyć się podstawowego jistu semafora w problemie Jadącego Filozofa. Teraz, mam tablicę klasy Chopstick, a każdy Chopstick ma semafora z 1 wolny zezwolenia:Problemy semaforowe w Javie z Filozofami Jadalnictwa
public class Chopstick
{
Thread holder = null;
private Semaphore lock = new Semaphore(1);
public synchronized void take() throws InterruptedException
{
this.lock.acquire();
holder = Thread.currentThread();
}
public synchronized void release()
{
this.lock.release();
holder = null;
}
}
Zmienna uchwyt służy do funkcji, że nie jestem pewien, czy potrzebne są:
public synchronized void conditionalRelease()
{
if (holder == Thread.currentThread())
{
holder = null;
this.lock.release();
}
}
Program kompiluje się i działa, ale wydaje się, że ma pewne problemy z wypuszczaniem pałeczek. Czasami pałeczki zostają uwolnione, czasami nie. Kiedy nie wypuszczają, program ostatecznie zawiesza się, gdy wszystkie pałeczki są brane i jeden filozof jest głodny.
Oto kod wewnątrz klasy filozof zwolnić chopstick po losowym czasie:
System.out.println(this.name + " is eating");
Thread.sleep(this.getRandTime());
System.out.println(this.name + " has finished eating");
rightChopstick.release();
System.out.println(this.name + " has released the right chopstick");
leftChopstick.release();
System.out.println(this.name + " has released the left chopstick");
Mój program ma wyjścia „Filozof 0 skończył jeść”, na przykład, i kontynuuje wykonywanie. Pozostałe dwie linie nigdy się nie wyprowadzają, więc oczywiście coś jest nie tak z tym, co wypuszczam.
Każda pomoc jest doceniana.
Ha! Dokładnie to było ... Musiałem wdrożyć te dwa różne sposoby przypisania i skopiowałem kod do pierwszej metody i zapomniałem usunąć zsynchronizowane słowo kluczowe. Miłe znalezisko. –