Lock锁中ReentrantLock中Condition的使用
package com.lezu.springboot.controller;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** ReentrantLock中Condition的使用* PrintA、PrintB、PrintC三个方法* 运行顺序为 PrintA -> PrintB -> PrintC 这个时候可以使用到ReentrantLock配和Condition来使用* 举例场景:下单(订单表)-->支付(支付表)-->发送通知短信-->物流-->完成交易发放积分*/
public class ConditionTest {public static void main(String[] args) {Data3 date = new Data3();new Thread(() -> {for (int i = 0; i < 10; i++) {date.PrintA();}}, "A").start();new Thread(() -> {for (int i = 0; i < 10; i++) {date.PrintB();}}, "B").start();new Thread(() -> {for (int i = 0; i < 10; i++) {date.PrintC();}}, "C").start();}}/*** 当number==1的时候运行PrintA* 当number==2的时候运行PrintB* 当number==3的时候运行PrintC*/
class Data3 {private Lock lock = new ReentrantLock();private Condition condition1 = lock.newCondition();private Condition condition2 = lock.newCondition();private Condition condition3 = lock.newCondition();private int number = 1;public void PrintA() {lock.lock();try {while (number == 1) {//唤醒PrintBSystem.out.println(Thread.currentThread().getName() + "==>AAA");number = 2;condition2.signal();}//PrintA等待condition1.await();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void PrintB() {lock.lock();try {while (number == 2) {//唤醒PrintCSystem.out.println(Thread.currentThread().getName() + "==>BBB");number = 3;condition3.signal();}//PrintB等待condition2.await();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void PrintC() {lock.lock();try {while (number == 3) {//唤醒PrintASystem.out.println(Thread.currentThread().getName() + "==>CCC");number = 1;condition1.signal();}//PrintC等待condition3.await();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}
运行结果
补充 ReentrantLock和synchronized的区别:
1.使用区别
1、Lock是一个接口,而synchronized是关键字,是JVM内置的语言实现。
2、Synchronized发生异常时,会自动释放线程占用的锁,不会发生死锁现象。Lock发生异常时,若没有主动释放,极有可能造成死锁,需要在finally中调用unlock()方法释放锁。
3、Lock有着显式的操作过程,开发人员必须手动指定何时加锁,何时释放锁,因而重入锁对逻辑控制的灵活性优于synchronized。
4、一个ReentrantLock可以绑定多个Condition对象,仅需多次调用new Condition()即可。而在synchronized中锁对象的wait()、notify()/notifyAll()可以实现一个隐含的条件,如果要和多余的条件关联,就不得不使用多个锁。
性能比较
JDK5中,重入锁的性能是远优于synchronized的。因为这是一个重量级操作,对性能的最大的影响是阻塞的实现,挂起线程和恢复线程的操作,都需要转入内核态中完成,给并发带来很大的压力。
但从JDK6开始,synchronized中加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化之后,两者的性能差距不大了。
Lock锁中ReentrantLock中Condition的使用相关推荐
- ReentrantLock和Condition理解及应用
Condition: Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个条件(Condition),只有当该条件具备( signal 或者 signalAll方法被带 ...
- java 代码锁_Java中的Lock锁
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...
- java lock unlock_【Java并发007】原理层面:ReentrantLock中lock()、unlock()全解析
一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...
- java中ReentrantLock实现,公平锁和非公平锁,AQS并发队列,
一般在java中,遇到并发的时候,我们很多时候可能会使用synchronized关键字来实现锁,但是synchronized关键字有一定的缺陷(比如无法实现类似读锁.非公平),而Lock可以实现.在j ...
- java中的Lock锁
一. 概述 Lock 是 java.util.concurrent.locks 包 下的接口,Lock 实现提供了比 synchronized 关键字 更广泛的锁操作,它能以更优雅的方式处理线程同步问 ...
- 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础
欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...
- 铂金1:探本溯源-为何说Lock接口是Java中锁的基础
欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...
- java中Lock锁的应用简介
java中Lock锁的应用简介 整体描述 方法介绍 1. void lock() 2. boolean tryLock() 3. boolean tryLock(long timeout, TimeU ...
- ReentrantLock中公平锁和非公平锁的区别
目录 背景知识 ReentrantLock的组成 概述 公平锁示意图 非公平锁示意图 源码解读 非公平锁 公平锁 代码对比 问题 知识扩展 tryLock方法 参考资料 背景知识 ReentrantL ...
最新文章
- php点击按钮后弹窗,如何在静态页添加按钮,点击时弹出功能界面
- 【NOIP模拟赛】藏宝图 最小生成树
- [leetcode]203. Remove Linked List Elements链表中删除节点
- 【小题目】输入一个数字表示重量,如果重量<=20,则每千克收费0.35元;如果超过20千克不超过100千克的范围,则超过的部分按照每千克0.5元收费;如果超过100千克,则超过的范围按照每千克0.8元
- java限制一个接口的执行时间_Java 并发编程:任务执行器 Executor 接口
- [linux]redhat7.6 安装telnet
- 解决问题---docker:transport: dial unix:///var/run/docker/containerd/docker-containerd.sock: time
- 计算机毕业设计网吧管理,毕业设计50河北大学计算机毕业设计网吧管理系统.doc...
- 易邮服务器com组件注册失败,com组件注册失败有什么办法可以解决
- 每日一淘洞察市场消费真相,深挖三四五线城市消费者需求
- 微信HOOK 1.获取二维码
- 专访AWR市场副总裁Sherry Hess:全面发力 深耕中国市场
- python聊天室_python聊天室
- 基于JSoup的网络爬虫爬取小说内容
- 减法公式运算法则_数学加减法运算和运算法则
- Codeforces 854 D Jury Meeting(前缀和后缀)
- oracle wallet java_Oracle Wallet初探
- Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS
- JavaFx之TableView表格操作----增删改及行多选
- Qt给字体设置下划线