博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
reentrantlock用于替代synchronized
阅读量:6915 次
发布时间:2019-06-27

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

1.①使用reentrantlock可以完成同样的功能

   ②需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)
   ③使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放

Lock lock = new ReentrantLock();void m1() {    try {        lock.lock(); //synchronized(this)        for (int i = 0; i < 10; i++) {            TimeUnit.SECONDS.sleep(1);            System.out.println(i);        }    } catch (InterruptedException e) {        e.printStackTrace();    } finally {        lock.unlock();    }}

 

2.使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待

/** * 使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行 * 可以根据tryLock的返回值来判定是否锁定 * 也可以指定tryLock的时间,由于tryLock(time)抛出异常,所以要注意unclock的处理,必须放到finally中 */void m2() {    /*    boolean locked = lock.tryLock();    System.out.println("m2 ..." + locked);    if(locked) lock.unlock();    */        boolean locked = false;        try {        locked = lock.tryLock(5, TimeUnit.SECONDS);        System.out.println("m2 ..." + locked);    } catch (InterruptedException e) {        e.printStackTrace();    } finally {        if(locked) lock.unlock();    }    }

 

3.使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应;在一个线程等待锁的过程中,可以被打断

Thread t2 = new Thread(()->{    try {        //lock.lock();        lock.lockInterruptibly(); //可以对interrupt()方法做出响应        System.out.println("t2 start");        TimeUnit.SECONDS.sleep(5);        System.out.println("t2 end");    } catch (InterruptedException e) {        System.out.println("interrupted!");    } finally {        lock.unlock();    }});t2.start();

 

4.ReentrantLock还可以指定为公平锁

private static ReentrantLock lock=new ReentrantLock(true); //参数为true表示为公平锁,请对比输出结果public void run() {    for(int i=0; i<100; i++) {        lock.lock();        try{            System.out.println(Thread.currentThread().getName()+"获得锁");        }finally{            lock.unlock();        }    }}

 

转载地址:http://ukicl.baihongyu.com/

你可能感兴趣的文章
20个java异常处理最佳实践
查看>>
centos架设pptp服务:并测试windos客户端、Linux客户端!
查看>>
【c#】BackgroundWorker类的使用方法
查看>>
【NetApp】启用smb2.0
查看>>
001作业题
查看>>
关于实习
查看>>
叠加等边三角形
查看>>
【对拍√】
查看>>
重载,继承,重写,多态的区别
查看>>
NUnit笔记
查看>>
maven添加sqlserver的jdbc驱动包
查看>>
POJ 1426 Find The Multiple
查看>>
WPF入门教程系列五——Window 介绍
查看>>
数字图像处理中所用数学工具4---集合、逻辑操作与模糊集合
查看>>
网页换肤
查看>>
[BZOJ3751/NOIP2014]解方程
查看>>
【Java例题】3.5 级数之和
查看>>
silverlight多国语言研究
查看>>
开发--省级三联动,简单的代码,但是功能不差
查看>>
赋值法
查看>>