关于什么是哲学家用餐问题大家可以百度查一下,这是一个经典的死锁问题
基本知识 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; 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 { } }
运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)