我必须解决餐饮哲学家问题上的僵局,尽管我认为我做到了,但我不确定是否还有我尚未发现的问题。我的解决方案很简单,这使我不安全。
这是我锁住的筷子课的一部分:
boolean inUse;
ReentrantLock lock = new ReentrantLock();
public void pickUp() throws InterruptedException {
lock.lock();
try {
while (isInUse()) {
Thread.sleep(100);
}
setInUse(true);
}
finally {
lock.unlock();
}
}
我使用ReentrantLock来确保两个线程不能同时拿起筷子。因此,即使日程安排分配了另一个要运行的线程,锁也会避免它可以拿起这把筷子。我现在的解决方案是执行以下操作:
public void run() {
try {
while (true) {
leftChopstick.pickUp();
if(!rightChopstick.inUse) {
rightChopstick.pickUp();
eat();
rightChopstick.putDown();
}
leftChopstick.putDown();
think();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
当右筷子已经在使用中时,线程会释放左筷子。
这有效吗?释放使用的资源是否是解决僵局的坏主意?我还没有看到僵局吗?