博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java可重入锁reentrantlock
阅读量:5130 次
发布时间:2019-06-13

本文共 2845 字,大约阅读时间需要 9 分钟。

public class ReentrantDemo {    //重入锁 保护临界区资源count,确保多线程对count操作的安全性    /*public static ReentrantLock rtlock = new ReentrantLock();    public static int count = 0;    Thread t = new Thread(new Runnable() {        @Override        public void run() {            for(int i=0;i<100000;i++){                rtlock.lock();                try{                    count++;                }finally {                    rtlock.unlock();                }            }        }    });*/    //重入锁 对于死锁的中断响应    public static ReentrantLock rtlock1 = new ReentrantLock();    public static ReentrantLock rtlock2 = new ReentrantLock();    private int lock;    public ReentrantDemo(int lock){        this.lock = lock;    }    Thread t = new Thread(new Runnable() {        @Override        public void run() {            try{                if(lock == 1){                    /*                    当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,                    而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程                    注意是:等待的那个线程B可以被中断,不是正在执行的A线程被中断                     */                    rtlock1.lockInterruptibly();                    try{                        Thread.sleep(3000);                    }catch (InterruptedException e){                    }                    rtlock2.lockInterruptibly();                }                else{                    rtlock2.lockInterruptibly();                    try{                        Thread.sleep(500);                    }catch (InterruptedException e){                    }                    rtlock1.lockInterruptibly();                }            }catch (InterruptedException e){                e.getMessage();            }finally {                if(rtlock1.isHeldByCurrentThread())                    rtlock1.unlock();                if(rtlock2.isHeldByCurrentThread())                    rtlock2.unlock();                System.out.println("线程退出:" + Thread.currentThread().getName());            }        }    });    public static void main(String[] args) throws InterruptedException{        /*ReentrantDemo rtd = new ReentrantDemo();        Thread t1 = new Thread(rtd.t);        Thread t2 = new Thread(rtd.t);        Thread t3 = new Thread(rtd.t);        t1.start();        t2.start();        t3.start();        t1.join();        t2.join();        t3.join();        System.out.println(count);*/        /*        避免死锁的方法:1. 外部方法,通过中断避免死锁                      2. 锁申请限时等待                      3. ReentrantLock.tryLock()         */        ReentrantDemo rtd1 = new ReentrantDemo(1);        ReentrantDemo rtd2 = new ReentrantDemo(1);        Thread t1 = new Thread(rtd1.t);        Thread t2 = new Thread(rtd2.t);        t1.start();        t2.start();        Thread.sleep(1000);        //t2中断  释放资源        t2.interrupt();    }}

 

转载于:https://www.cnblogs.com/mutong1228/p/10563036.html

你可能感兴趣的文章
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
距离公式汇总以及Python实现
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
VC6.0调试技巧(一)(转)
查看>>
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>