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

tryLock解决哲学家用餐死锁问题,第1张

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;


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 {

    }
}

运行结果

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5685968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存