精确通知,顺序访问——Lock锁比synchronized锁的优势之处
题目如下:
多线程之间按顺序调用,实现A-》B-》C
三个线程启动,要求如下:
AA 打印5次,BB 打印10次,CC 打印15次
接着
AA 打印5次,BB 打印10次,CC 打印15次
......来10轮
package com.dym.juc;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class ShareResource{private int number=1; //1:A 2:B 3:Cprivate Lock lock=new ReentrantLock();private Condition condition1=lock.newCondition();private Condition condition2=lock.newCondition();private Condition condition3=lock.newCondition();public void print5(){lock.lock();try {//1. 判断while (number!=1){condition1.await();}//2. 干活for (int i = 1; i <=5 ; i++) {System.out.println(Thread.currentThread().getName()+"\t"+i);}//3. 通知number=2;condition2.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void print10(){lock.lock();try {//1. 判断while (number!=2){condition2.await();}//2. 干活for (int i = 1; i <=10 ; i++) {System.out.println(Thread.currentThread().getName()+"\t"+i);}//3. 通知number=3;condition3.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void print15(){lock.lock();try {//1. 判断while (number!=3){condition3.await();}//2. 干活for (int i = 1; i <=15 ; i++) {System.out.println(Thread.currentThread().getName()+"\t"+i);}//3. 通知number=1;condition1.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}
}// 多线程之间按顺序调用,实现A-》B-》C
// 三个线程启动,要求如下:
// AA 打印5次,BB 打印10次,CC 打印15次
// 接着
// AA 打印5次,BB 打印10次,CC 打印15次
// ......来10轮
/*1 高内聚低耦合的前提下,线程操作资源类2 判断/干活/通知3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)4 标志位
*/public class ThreadOrderAccess {public static void main(String[] args) {ShareResource shareResource=new ShareResource();new Thread(()->{for (int i = 1; i <=10 ; i++) {shareResource.print5();}},"AA").start();new Thread(()->{for (int i = 1; i <=10 ; i++) {shareResource.print10();}},"BB").start();new Thread(()->{for (int i = 1; i <=10 ; i++) {shareResource.print15();}},"CC").start();}
}
精确通知,顺序访问——Lock锁比synchronized锁的优势之处相关推荐
- Lock锁与synchronized锁的区别
Lock锁与synchronized锁的区别 1.synchronized锁是可以帮助我们自动开锁和关闭锁 2.Lock锁,我们最常用的是ReentrantLock重入锁,需要我们手动的开锁和手动关锁 ...
- 并发编程 Java 三把锁(Synchronized、ReentrantLock、ReadWriteLock)
Synchronized synchronized 的 3 种用法: 指定加锁对象(代码块):对给定对象加锁,进入同步代码前要获得给定对象的锁. void resource1() {synchroni ...
- Java多线程,锁(CAS,synchronized,AQS,ReentrantLock)
该博客只是个人学习的笔记.如果有什么疑问或者有什么不对的都可以告诉我,目前只写了多线程和锁的部分,因为只是个人学习记录的笔记,所以写的不是很详细,里面有一些个人的见解思考供各位参考. 一.多线程 关于 ...
- synchronized锁的级别和ReentrantLock锁(AQS)
目录 synchronized synchronized锁的特点 synchronized锁级别 无锁 偏向锁 轻量级锁 重量级锁 自旋锁 锁消除 ReentrantLock 公平锁和非公平锁 AQS ...
- synchronized 锁的是什么?
概述 本文我们将回答两个问题: synchronized 锁的是什么? 为什么 wait() 和 notify() 需要搭配 synchonized 关键字使用 ? 我将通过先介绍基础知识再回答问题的 ...
- synchronized锁(方法锁, 代码块锁)
synchronized锁可以解决线程安全问题,但是相应的,只要是锁,就会带来性能开销,所以尽可能减小锁的范围尤为重要. synchronized锁无非修饰普通方法,修饰静态方法,修饰代码块,我认为无 ...
- java 锁表后事务提交_关于synchronized锁在Spring事务中进行数据更新同步,仍出现线程安全问题...
#1 问题描述# 最近有小伙伴在做商品抽奖活动时,在对奖品库存进行扣减,有线程安全的问题,遂加锁synchronized进行同步,但发现加锁后并没有控制住库存线程安全的问题,导致库存仍被超发. 先简单 ...
- 关于synchronized锁在Spring事务中进行数据更新同步,仍出现线程安全问题
为什么80%的码农都做不了架构师?>>> #1 问题描述# 最近有小伙伴在做商品抽奖活动时,在对奖品库存进行扣减,有线程安全的问题,遂加锁synchronized进行同步,但发 ...
- JVM内部锁升级过程(偏向锁,轻量级锁,重量级锁)
目录 对象在内存中是如何布局的 如何查看对象在内存中的布局 markword数据结构 加锁后发生了什么 偏向锁 什么是偏向锁 偏向锁定时hashCode 哪去了? 为什么需要偏向锁 为什么从JDK15 ...
最新文章
- 自动填充脚本使用及注意事项
- Services(服务)
- 终于有人把 SpringBoot 项目的Http客户端工具说清楚了!
- pytorch下载mnist超时解决方案
- creo导入特征怎么实体化_Creo/Proe云图抄数牙刷抄数造型
- python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?
- 雪城大学信息安全讲义 五、竞态条件
- ttys和tty_Linux中tty、pty、pts的概念区别
- linux系统端口更换,在Linux中怎样修改httpd的端口号
- Liver Writer打开以前的日志/页面
- 软件常见出现缺陷的地方
- keepalived+lvs实现高可用的负载均衡
- word参考文献编号、引用、修改
- MySQL 窗函数 流动平均数 running average
- matlab kmeans 质心,KMeans_SPD_Matrices
- 软件测试 | 测试方案怎么写
- 一只小白,在学习delphi.感觉很吃力。。
- 牢记这一波CAD快捷键,制图速度坐火箭!
- android国家码
- 更透明的隐私设置和全新的APP资源库:iOS 14测试版深度体验~~~