我正在尋找一種方法來解決使用信號量的哲學家哲學問題,我很困擾我該怎麼去做。我已經在下面包含了我的代碼。餐飲哲學家使用信號燈
class ChopStick{
private int count;
private boolean inuse;
Lock lock = new ReentrantLock();
Condition notInUse = lock.newCondition();
public ChopStick(){
inuse = false;
}
public void pickUp(){
lock.lock();
try{
while(inuse){
try{
notInUse.await();
}catch(InterruptedException e){}
}
inuse = true;
}finally{lock.unlock();}
}
public void putDown(){
lock.lock();
try{
inuse = false;
notInUse.signal();
}finally{lock.unlock();}
}
}
class Philosopher extends Thread{
Semaphore sem;
private ChopStick ch1,ch2; //chopsticks
private int phil; //philosopher id
public Philosopher(int p, ChopStick left, ChopStick right, Semaphore s){
phil = p;
ch1 = left;
ch2 = right;
sem = s;
}
public void run() {
while(true){
try {
sem.acquire();
} catch (InterruptedException e) {}
think(phil);
//pickup chopsticks
ch1.pickUp();
ch2.pickUp();
eat(phil);
//putdown chopsticks
ch1.putDown();
ch2.putDown();
sem.release();
}
}
我在想,當一個哲學家拿起使用sem.acquire()
一根筷子,然後當他們使用sem.release()
完成,但我不知道這是否是正確的。是嗎?
編輯所以我已經實現了這一點。它似乎工作,但我不知道。
class ChopStick{
private Semaphore sem;
public ChopStick(Semaphore s){
sem = s;
}
public void pickUp(){
try{
sem.acquire();
}catch(InterruptedException e){}
}
public void putDown(){
sem.release();
}
https://www.youtube.com/watch?v=M3CNoX8wetM – Anonymous 2014-11-23 01:37:02
我知道它是如何工作的,我正在尋求使用信號量解決。 – Strobes 2014-11-23 02:01:59
@Strobes新代碼可能會遇到死鎖,請參閱編輯我的答案,以防止出現這種情況 – 2014-11-23 15:28:23