关于什么是哲学家用餐问题大家可以百度查一下,这是一个经典的死锁问题
基本知识 ReentrantLock
tryLock
仅当调用时其他线程未持有该锁时才获取该锁。
如果锁未被另一个线程持有,则获取该锁并立即返回true值,将锁持有计数设置为 1。 即使此锁已设置为使用公平排序策略,调用tryLock()将立即获取可用的锁,无论其他线程当前是否正在等待该锁。 这种“闯入”行为在某些情况下很有用,即使它破坏了公平。 如果您想遵守此锁的公平性设置,请使用几乎等效的tryLock(0, TimeUnit.SECONDS) (它还检测中断)。
如果当前线程已持有此锁,则持有计数将增加 1 并且该方法返回true 。
如果锁被另一个线程持有,那么这个方法将立即返回false值
public boolean tryLock() {
return sync.nonfairTryAcquire(1);
}
代码
package com.pm.biz.flexibleworker.base.dvo.vo;
import java.util.concurrent.locks.ReentrantLock;
/**
* 用tryLock解决哲学家用餐死锁问题
*/
public class Test15 {
public static void main(String[] args) {
//5根筷子
Chopstick c1 = new Chopstick();
Chopstick c2 = new Chopstick();
Chopstick c3 = new Chopstick();
Chopstick c4 = new Chopstick();
Chopstick c5 = new Chopstick();
//5个哲学家
new zxj("1号",c1,c2).start();
new zxj("2号",c2,c3).start();
new zxj("3号",c3,c4).start();
new zxj("4号",c4,c5).start();
new zxj("5号",c5,c1).start();
}
static class zxj extends Thread{
Chopstick left;
Chopstick right;
String name;
public zxj(String name,Chopstick left,Chopstick right){
super(name);
this.name=name;
this.left=left;
this.right=right;
}
@Override
public void run() {
while (true){
if(left.tryLock()){ //尝试获取锁,如果没有获取到着进入下一次循环
try{
if(right.tryLock()){
try{
System.out.println(name+"吃到");
return;
}finally {
right.unlock();
}
}
}finally {
left.unlock();
}
}
}
}
}
//锁对象继承ReentrantLock
static class Chopstick extends ReentrantLock {
}
}
运行结果