相比synchronized,ReentrantLock具备以下特点:

  1. 可中断
  2. 可以设置超长时间
  3. 可以设置为公平锁
  4. 可以支持多个条件变量
    与synchronized一样,都支持可重入.

验证可重入

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.TestReentrantLock")
public class TestReentrantLock {private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {lock.lock();try{log.debug("进入主方法");m1();}finally {lock.unlock();}}// 测试可重入public static void m1() {lock.lock();try{log.debug("进入m1方法");m2();}finally {lock.unlock();}}public static void m2() {lock.lock();try{log.debug("进入m2方法");}finally {lock.unlock();}}
}

验证可打断性

lock()方法不具备打断性

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.TestReentrantLock")
public class TestReentrantLock {private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {// 防止无限制的等待下去Thread t1 = new Thread(()->{lock.lock();//lock()方法不能被打断try{log.debug("获取锁");}finally {lock.unlock();log.debug("finally...");}});lock.lock();t1.start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 去打断t1,不起作用。因为lock()方法不能被打断t1.interrupt();}}

locklockInterruptibly方法可以被打断,停止线程无限制的等待.

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.TestReentrantLock")
public class TestReentrantLock {private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {// 防止无限制的等待下去Thread t1 = new Thread(()->{try{log.debug("尝试获取锁");lock.lockInterruptibly();//locklockInterruptibly方法可以被打断}catch (InterruptedException e){e.printStackTrace();log.debug("没有或得锁, 返回");return;}try{log.debug("获取锁");}finally {lock.unlock(); // 释放锁log.debug("finally...");}});lock.lock();t1.start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("打断t1");// 去打断t1,不起作用。因为lock()方法不能被打断t1.interrupt();}
}

验证锁超时

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.TestReentrantLock")
public class TestReentrantLock {private static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {Thread t = new Thread(()->{//            if(!lock.tryLock()){//                log.debug("获取锁失败");
//                return;
//            }try {// 尝试获取锁,如果1秒内,获取不到锁就会获取锁失败if(!lock.tryLock(1,TimeUnit.SECONDS)){ log.debug("获取锁失败");return;}} catch (InterruptedException e) {// 表示可以调用 interrupt()方法,打断线程log.debug("获取锁失败");e.printStackTrace();return;}try{log.debug("获取锁成功");}finally {lock.unlock();}},"t1");lock.lock();log.debug("获取锁");t.start();try {Thread.sleep(2000); // 睡眠2秒} catch (InterruptedException e) {e.printStackTrace();}log.debug("释放锁");lock.unlock();}
}

验证条件变量

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;@Slf4j(topic = "c.TestCondition")
public class TestCondition {static boolean hasCigarette = false;static boolean hasTakeout = false;static ReentrantLock ROOM = new ReentrantLock();static Condition waitCigaretteSet = ROOM.newCondition();static Condition waitTakeoutSet = ROOM.newCondition();public static void main(String[] args) {new Thread(()->{ROOM.lock();try{log.debug("烟送到没?[{}]",hasCigarette);while(!hasCigarette){log.debug("没烟,先歇会...");try {waitCigaretteSet.await();} catch (InterruptedException e) {e.printStackTrace();}}log.debug("开始干活...");}finally {ROOM.unlock();}},"小南").start();new Thread(()->{ROOM.lock();try{log.debug("外卖送到没?[{}]",hasTakeout);while(!hasTakeout){log.debug("没外卖,先歇会...");try {waitTakeoutSet.await();} catch (InterruptedException e) {e.printStackTrace();}}log.debug("开始干活...");}finally {ROOM.unlock();}},"小女").start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{ROOM.lock();try{hasCigarette = true;waitCigaretteSet.signal();}finally {ROOM.unlock();}}).start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{ROOM.lock();try{hasTakeout = true;waitTakeoutSet.signal();}finally {ROOM.unlock();}}).start();}
}

JUC并发编程八 并发架构--ReentrantLock相关推荐

  1. JUC并发编程八 并发架构--park,unpark

    wait,notify和notifyAll必须配合 Object Monitor一起使用.而park,unpark不用. park 和 unpark是以线程为单位阻塞和唤醒线程.而notify只能随机 ...

  2. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  3. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  4. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

  5. 【檀越剑指大厂--并发编程】并发编程总结

    并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...

  6. 【Java并发编程】并发编程大合集

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...

  7. java并发编程_Java并发编程之 synchronized

    大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...

  8. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM

    文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...

  9. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

最新文章

  1. java开心消消乐代码_今晚请屏住呼吸,开心消消乐拍电影了!
  2. 2019ug最新版本是多少_UGNX将在2019年发布最新版本,也是最后一个版本,让人更意想不到的是它的这项新功能!...
  3. Android下的数据存储与访问、权限
  4. mac os 和 ubuntu 上测试工具check-0.9.10的安装
  5. Android开发之自定义Toast(吐司)
  6. C++描述杭电OJ 2012. 素数判定 ||
  7. Android中打包含有Activity以及资源文件的jar包在工程中调用
  8. 95-36-030-ChannelHandler-ChannelInboundHandler
  9. day16【前台】项目展示
  10. python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...
  11. ZPCategory
  12. LINUX下载编译pcre
  13. 基于java web的学生考勤带请假管理系统——计算机毕业设计
  14. 城市智慧灯杆解决方案
  15. Android 手机做麦克风扩音器demo
  16. 阿里巴巴编码规范习题
  17. html5 队列展示,设计一个队列研究实例
  18. 因结婚彩礼起积怨 山西一男子行凶致1死5伤
  19. Mac升级python版本
  20. 华硕服务器如何重装系统,讲解华硕重装系统教程

热门文章

  1. 随机模拟【1】:随机模拟的研究范围与特征
  2. 解决三星 BIOS 模式没有 Fast Bios Mode选项 U盘动项问题
  3. 多区域显示(8)-透明花边
  4. Windows服务ServicesDependedOn的奇怪问题?
  5. 汇编实验4.1文件代号下的文件管理中为什么buf_size为80而buf可以容纳200个字节,矛盾吗?(不矛盾)
  6. 浮点数能进行取模运算吗?(不行,暂时只能是两个整数之间)
  7. 运动学与雅可比矩阵举例
  8. 国内小程序生态服务平台即速应用完成5000万元A+轮融资
  9. java基础---动态代理机制
  10. 基于nginx和uWSGI在Ubuntu系统上部署Django项目