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的使用相关推荐

  1. ReentrantLock和Condition理解及应用

    Condition: Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个条件(Condition),只有当该条件具备( signal 或者 signalAll方法被带 ...

  2. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  3. java lock unlock_【Java并发007】原理层面:ReentrantLock中lock()、unlock()全解析

    一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...

  4. java中ReentrantLock实现,公平锁和非公平锁,AQS并发队列,

    一般在java中,遇到并发的时候,我们很多时候可能会使用synchronized关键字来实现锁,但是synchronized关键字有一定的缺陷(比如无法实现类似读锁.非公平),而Lock可以实现.在j ...

  5. java中的Lock锁

    一. 概述 Lock 是 java.util.concurrent.locks 包 下的接口,Lock 实现提供了比 synchronized 关键字 更广泛的锁操作,它能以更优雅的方式处理线程同步问 ...

  6. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  7. 铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  8. java中Lock锁的应用简介

    java中Lock锁的应用简介 整体描述 方法介绍 1. void lock() 2. boolean tryLock() 3. boolean tryLock(long timeout, TimeU ...

  9. ReentrantLock中公平锁和非公平锁的区别

    目录 背景知识 ReentrantLock的组成 概述 公平锁示意图 非公平锁示意图 源码解读 非公平锁 公平锁 代码对比 问题 知识扩展 tryLock方法 参考资料 背景知识 ReentrantL ...

最新文章

  1. php点击按钮后弹窗,如何在静态页添加按钮,点击时弹出功能界面
  2. 【NOIP模拟赛】藏宝图 最小生成树
  3. [leetcode]203. Remove Linked List Elements链表中删除节点
  4. 【小题目】输入一个数字表示重量,如果重量<=20,则每千克收费0.35元;如果超过20千克不超过100千克的范围,则超过的部分按照每千克0.5元收费;如果超过100千克,则超过的范围按照每千克0.8元
  5. java限制一个接口的执行时间_Java 并发编程:任务执行器 Executor 接口
  6. [linux]redhat7.6 安装telnet
  7. 解决问题---docker:transport: dial unix:///var/run/docker/containerd/docker-containerd.sock: time
  8. 计算机毕业设计网吧管理,毕业设计50河北大学计算机毕业设计网吧管理系统.doc...
  9. 易邮服务器com组件注册失败,com组件注册失败有什么办法可以解决
  10. 每日一淘洞察市场消费真相,深挖三四五线城市消费者需求
  11. 微信HOOK 1.获取二维码
  12. 专访AWR市场副总裁Sherry Hess:全面发力 深耕中国市场
  13. python聊天室_python聊天室
  14. 基于JSoup的网络爬虫爬取小说内容
  15. 减法公式运算法则_数学加减法运算和运算法则
  16. Codeforces 854 D Jury Meeting(前缀和后缀)
  17. oracle wallet java_Oracle Wallet初探
  18. Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS
  19. JavaFx之TableView表格操作----增删改及行多选
  20. Qt给字体设置下划线

热门文章

  1. java基于ssm的个人博客系统个人博客网站个人博客项目源码
  2. nlp-Embedding
  3. 逻辑思维强的人适合学计算机不,逻辑思维强的人适合什么工作?
  4. 优化算法选择:SGD、SGDM、NAG、Adam、AdaGrad、RMSProp、Nadam
  5. 管理经济学【五】之 生产要素投入的决策分析
  6. 单片机读取多路温度c语言,以51单片机为内核实现了两路温度采集与显示的温度控制器设计...
  7. Arcgis ArcTutor数据下载
  8. 数学文化 卢卡斯数列和黄金分割
  9. 电商订舱哪家靠谱 广州力其
  10. vue中自定义select