栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 {

    }
}

运行结果

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685420.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号