tryLock解决哲学家用餐死锁问题

关于什么是哲学家用餐问题大家可以百度查一下,这是一个经典的死锁问题

基本知识  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 {

    }
}

运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值