JUC并发编程八 并发架构--ReentrantLock
相比synchronized,ReentrantLock具备以下特点:
- 可中断
- 可以设置超长时间
- 可以设置为公平锁
- 可以支持多个条件变量
与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相关推荐
- JUC并发编程八 并发架构--park,unpark
wait,notify和notifyAll必须配合 Object Monitor一起使用.而park,unpark不用. park 和 unpark是以线程为单位阻塞和唤醒线程.而notify只能随机 ...
- java lock 对象_Java并发编程锁系列之ReentrantLock对象总结
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- 【檀越剑指大厂--并发编程】并发编程总结
并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...
- 【Java并发编程】并发编程大合集
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...
- java并发编程_Java并发编程之 synchronized
大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...
- 并发编程-02并发基础CPU多级缓存和Java内存模型JMM
文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...
- 学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...
最新文章
- java开心消消乐代码_今晚请屏住呼吸,开心消消乐拍电影了!
- 2019ug最新版本是多少_UGNX将在2019年发布最新版本,也是最后一个版本,让人更意想不到的是它的这项新功能!...
- Android下的数据存储与访问、权限
- mac os 和 ubuntu 上测试工具check-0.9.10的安装
- Android开发之自定义Toast(吐司)
- C++描述杭电OJ 2012. 素数判定 ||
- Android中打包含有Activity以及资源文件的jar包在工程中调用
- 95-36-030-ChannelHandler-ChannelInboundHandler
- day16【前台】项目展示
- python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...
- ZPCategory
- LINUX下载编译pcre
- 基于java web的学生考勤带请假管理系统——计算机毕业设计
- 城市智慧灯杆解决方案
- Android 手机做麦克风扩音器demo
- 阿里巴巴编码规范习题
- html5 队列展示,设计一个队列研究实例
- 因结婚彩礼起积怨 山西一男子行凶致1死5伤
- Mac升级python版本
- 华硕服务器如何重装系统,讲解华硕重装系统教程
热门文章
- 随机模拟【1】:随机模拟的研究范围与特征
- 解决三星 BIOS 模式没有 Fast Bios Mode选项 U盘动项问题
- 多区域显示(8)-透明花边
- Windows服务ServicesDependedOn的奇怪问题?
- 汇编实验4.1文件代号下的文件管理中为什么buf_size为80而buf可以容纳200个字节,矛盾吗?(不矛盾)
- 浮点数能进行取模运算吗?(不行,暂时只能是两个整数之间)
- 运动学与雅可比矩阵举例
- 国内小程序生态服务平台即速应用完成5000万元A+轮融资
- java基础---动态代理机制
- 基于nginx和uWSGI在Ubuntu系统上部署Django项目