私はダイエットの哲学者の問題でセマフォの基本的なジストを学ぼうとしています。今、私はクラス箸の配列を持ち、それぞれの箸は1つの利用できる許可証を持つセマフォを持っていますJavaのダイエット哲学者とのセマフォの問題
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();
}
}
プログラムはコンパイルされて実行されますが、箸を放すには問題があるようです。時には、箸が解放されることもあれば、しないこともあります。彼らが解放されなければ、プログラムは最終的にすべての箸が取られ、1人の哲学者が空腹になるとハングアップします。ここで
は、ランダムな時間後に箸を解放する哲学者のクラス内のコードです:
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は、食べ終わった」、および実行を継続ありません。他の2行は決して出力されないので、明らかに私がリリースしている方法で何かが間違っています。
何か助けていただければ幸いです。
ハ!それはまさにそれでした...割り当てのためにこの2つの異なる方法を実装しなければならず、最初のメソッドのコードをコピーして貼り付け、synchronizedキーワードを削除するのを忘れました。ニースを見つける。 –