Я пытаюсь выучить основную часть семафора в задаче «Обедающий философ». Прямо сейчас у меня есть массив класса Chopstick, и у каждого Chopstick есть семафор с 1 доступным разрешением:
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;
}
}
Переменная-держатель используется для функции, в которой я не уверен:
public synchronized void conditionalRelease()
{
if (holder == Thread.currentThread())
{
holder = null;
this.lock.release();
}
}
Программа компилируется и запускается, но, похоже, возникают проблемы с выпуском палочек для еды. Иногда палочки для еды отпускаются, иногда нет. Когда они не выпускаются, программа в конце концов зависает, когда все палочки для еды взяты, и один философ голоден.
Вот код в классе Philosopher, чтобы выпустить палочку после случайного промежутка времени:
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");
Моя программа, например, выдает «Философ 0 закончил есть» и продолжает выполнение. Две другие строки никогда не выводятся, поэтому, очевидно, что-то не так с тем, как я выпускаю.
Любая помощь приветствуется.