使用 ReentrantLock 结合 Condition

package com.yyr.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;/*** * @ClassName: LockTest2* @Description: 用可重入锁模拟三个线程之间的通信* @author: yangyr* @date: 2019年11月9日 下午12:12:52*  * @Copyright: 2019 www.briup.com All rights reserved.*/
public class LockTest2 {public static void main(String[] args) {Out1 out = new Out1();new Thread() {@Overridepublic void run() {while(true) {try {out.out1();} catch (Exception e) {e.printStackTrace();}}}}.start();new Thread() {@Overridepublic void run() {while(true) {try {out.out2();} catch (Exception e) {e.printStackTrace();}}}}.start();new Thread() {@Overridepublic void run() {while(true) {try {out.out3();} catch (Exception e) {e.printStackTrace();}}}}.start();}
}
class Out1{ReentrantLock lock = new ReentrantLock();private Condition c1 = lock.newCondition();private Condition c2 = lock.newCondition();private Condition c3 = lock.newCondition();int flag = 1;//线程1public void out1() throws Exception {lock.lock();//获取锁if(flag!=1) {c1.await();}System.out.print("hello ");System.out.print("world");System.out.print("!");System.out.println("\r\n");flag = 2;c2.signal();lock.unlock();//释放锁资源}public void out2() throws InterruptedException {lock.lock();//获取锁if(flag!=2) {c2.await();}System.out.print("快乐");System.out.print("Java");System.out.print("!");System.out.println("\r\n");flag = 3;c3.signal();lock.unlock();//释放锁资源}public void out3() throws InterruptedException {lock.lock();//获取锁if(flag!=3) {c3.await();}System.out.print("谁");System.out.print("是");System.out.print("废");System.out.print("物");System.out.print("?");System.out.println("\r\n");flag = 1;c1.signal();//唤醒指定线程lock.unlock();//释放锁资源}}

使用synchronized,wait(),notifyAll()实现方式如下:

java:多线程(三个或三个以上间的线程通信)_对抗路、余温的博客-CSDN博客

Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别:

Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别_codingtu的博客-CSDN博客_java notify signal

可重入锁模拟三个线程之间的通信相关推荐

  1. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  2. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

  3. 线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁

    1. 线程调度 线程调度指的就是给线程分配使用处理器的过程.主要的调度方式有两种:协同式调度和抢占式调度. 1.1 协同式调度 线程完成自己的任务之后主动通知系统切换到另一个线程上. 优点: 实现简单 ...

  4. 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁

    这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁.这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现.可重入锁的特点是: 1. 是互 ...

  5. Java 可重入锁ReenTrant

    synchronized内置锁的可重入性: 线程同步synchronized中内置的"锁"机制是可重入锁,即一个线程取得某对象的锁,释放后其他线程还可以使用此锁,即可以重复使用. ...

  6. 可重入锁和不可重入锁详解

    目录 概念: 通俗理解: 可重入锁的工作原理: ReenTrantLock可重入锁和synchronized的区别: ReentrantLock源码分析: 可重入锁代码演示: 概念: Reentran ...

  7. 可重入锁-synchronized是可重入锁吗?

    目录 前言 1.什么是可重入锁呢? 2.自己写代码验证下可重入和不可重入 3.自己如何实现一个可重入和不可重入锁呢 4.ReentrantLock如何实现可重入的 5.可重入锁的特点 前言 面试题:s ...

  8. JUC - 多线程之悲观锁、乐观锁,读写锁(共享锁、独享锁),公平非公平锁,可重入锁,自旋锁,死锁(十)

    Java中主要有如下锁 一.悲观锁.乐观锁 悲观锁:当前线程去操作数据的时候,总是认为别的线程会去修改数据,所以每次操作数据的时候都会上锁,别的线程去操作数据的时候就会阻塞,比如synchronize ...

  9. Java高并发编程(六):重入锁

    重入锁定义:重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁的还支持获取锁时的公平和非公平性选择. ReentrantLock虽然没能像 ...

  10. python锁有哪几种_python 可重入锁有什么用?

    可重入锁:支持在同一线程中多次请求同一资源 import threading import time class MyThread(threading.Thread): def run(self): ...

最新文章

  1. 【linux】top命令详解
  2. 词云_jieba分词
  3. IDEA基于kotlin开发android程序配置小结
  4. win7安装git客户端和简单配置
  5. DevExpress v17.2新版亮点—WinForms篇(四)
  6. 过了这么多年,才发现写的最多的代码竟然是...
  7. oracle一体机诊断内存,Oracle内存诊断
  8. [leetcode]240. 搜索二维矩阵 II
  9. MYSQL服务器my.cnf配置文档详解
  10. 数学建模之相关分析分类与总结
  11. 苹果笔记本什么系统_收集整理:什么笔记本适合安装黑苹果系统!
  12. mysql认证 成都考点_CKA概述、考试形式、考试地址、考纲占比等
  13. 数通学习网络协议地图
  14. EXCEL预览正常,打印却是空白的解决方法之一
  15. b-spline学习-系数计算及程序实践
  16. Android安全编码规范
  17. 正则应用(用户名输入框)
  18. 生存分析——cox模型及相关参数求解
  19. 【linux】【docker】docker私服安装
  20. chmod不是内部或外部命令

热门文章

  1. python棋类项目规划一——五子棋游戏策划书——项目一
  2. 集成preempt-rt patch后发生panic的调试过程
  3. JavaScript名词shim与polyfill
  4. ODT,ZQ校准,OCT,TDQS
  5. Struts-2.3.24.1官方例子-struts2-blank
  6. html怎么使两张照片重叠,怎样把两张图片叠加在一起?
  7. 2021-09-07 照书码——_——
  8. 容易遗忘的几个js知识点(一)
  9. java 的vm是什么_java – 什么是VM,为什么动态语言需要一个?
  10. 加法的横式竖式教案c语言,竖式进位加法教案