Lock锁和Condition条件

2023-10-27

Lock的特性:

  1. Lock不是Java语言内置的;
  2. synchronized是在JVM层面上实现的,如果代码执行出现异常,JVM会自动释放锁,但是Lock不行,要保证锁一定会被释放,就必须将unLock放到finally{}中(手动释放);
  3. 在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetarntLock,但是在很激烈的情况下,synchronized的性能会下降几十倍;
  4. ReentrantLock增加了锁
    1. void lock(); // 无条件的锁;

    2. void lockInterruptibly throws InterruptedException;//可中断的锁;

      1. 使用ReentrantLock如果获取了锁立即返回,如果没有获取锁,当前线程处于休眠状态,直到获得锁或者当前线程可以被别的线程中断去做其他的事情;但是如果是synchronized的话,如果没有获取到锁,则会一直等待下去;

    3.  

      boolean tryLock();//如果获取了锁立即返回true,如果别的线程正持有,立即返回false,不会等待;

    4.  

      boolean tryLock(long timeout,TimeUnit unit);//如果获取了锁立即返回true,如果别的线程正持有锁,会等待参数给的时间,在等待的过程中,如果获取锁,则返回true,如果等待超时,返回false;

       

 

 

Condition的特性:

  1. Condition中的await()方法相当于Object的wait()方法
  2. Condition中的signal()方法相当于Object的notify()方法
  3. Condition中的signalAll()相当于Object的notifyAll()方法。
  4. 不同的是,Object中的这些方法是和同步锁捆绑使用的,而Condition是需要与互斥锁/共享锁捆绑使用的。
  5. Condition能够更加精细的控制多线程的休眠与唤醒。对于同一个锁,我们可以创建多个Condition,在不同的情况下使用不同的Condition。

Condition的案例

 

/**
 * @Author feizhou
 * @Description 测试让多线程按顺序执行,这里是  线程1,线程2,线程3
 * @Date 上午 12:40 2019/8/30 0030
 * @Param 
 * @return 
 **/

public class ConditionTest {

	private int conditionValue = 1;
	Lock lock = new ReentrantLock();
	Condition condition1 = lock.newCondition();
	Condition condition2 = lock.newCondition();
	Condition condition3 = lock.newCondition();
	/**
	 * @param args
	 */
	public static void main(String[] args) throws InterruptedException {
		ConditionTest conditionTest=new ConditionTest();

		//线程3
		new Thread(
				new Runnable() {
					@Override
					public void run() {
							conditionTest.test3();

					}
				}
		).start();

	Thread.sleep(2000);
		//线程2
		new Thread(
				new Runnable() {
					@Override
					public void run() {
							conditionTest.test2();
					}
				}
		).start();

		Thread.sleep(2000);
		//线程1
		conditionTest.test1();

	}



	public  void test1(){
		lock.lock();
		try{
			while(conditionValue != 1){
					System.out.println("test1 在等待");
					condition1.await();
			}
			System.out.println("test1 在执行");
			conditionValue = 2;
			condition2.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			lock.unlock();
		}
	}

	public  void test2(){
		lock.lock();
		try{
			while(conditionValue != 2){

					System.out.println("test2 在等待");
					condition2.await();

			}
			System.out.println("test2 在执行");
			conditionValue = 3;
			condition3.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			lock.unlock();
		}
	}

	public  void test3(){
		lock.lock();
		try{
			while(conditionValue != 3){

					System.out.println("test3 在等待");
					condition3.await();
			}
			System.out.println("test3 在执行");
			conditionValue = 3;
			condition3.signal();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}

}

结果
test3 在等待
test2 在等待
test1 在执行
test2 在执行
test3 在执行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lock锁和Condition条件 的相关文章

  • xpath,sax,DOM解析xml文件(基础)

    基础 XML解析器有二类 分别是DOM和SAX DOM DOM解析器在解析XML文档时 会把文档中的所有元素 按照其出现的层次关系 解析成一个个Node对象 节点 很方便对文档进行遍历 对文档curd也特别方便 xml文档比较大的时候 do
  • Tcp协议中的3次握手与4次挥手过程分析

    转载https blog csdn net u012824097 article details 52490091 客户端与服务端的通信中步骤 1建立Tcp连接 3次握手 2再进行数据传输 3数据传输完成后 断开连接 4次挥手 建立Tcp连
  • Lock锁和Condition条件

    Lock的特性 Lock不是Java语言内置的 synchronized是在JVM层面上实现的 如果代码执行出现异常 JVM会自动释放锁 但是Lock不行 要保证锁一定会被释放 就必须将unLock放到finally 中 手动释放 在资源竞
  • dubbo消费者源码解析

    一 服务消费者核心类ReferenceBean public void afterPropertiesSet throws Exception if applicationContext null BeanFactoryUtils bean
  • JAVA中的DO、DTO、BO、AO、VO、POJO

    定义 DO Data Object 与数据库表结构一一对应 通过DAO层向上传输数据源对象 DTO Data Transfer Object 数据传输对象 Service或Manager向外传输的对象 BO Business Object
  • @CallerSensitive

    CallerSensitive学习 代码位置 Reflection类 public class Reflection CallerSensitive public static native Class
  • 深入理解单例模式:静态内部类单例原理

    本文主要介绍java的单例模式 以及详细剖析静态内部类之所以能够实现单例的原理 OK 废话不多说 进入正文 首先我们要先了解下单例的四大原则 1 构造私有 2 以静态方法或者枚举返回实例 3 确保实例只有一个 尤其是多线程环境 4 确保反序
  • Java多态机制在实际中的应用

    在实际开发工作中 常常遇到一个功能有多种实现方式 比如支付方式 有分微信支付 京东支付 支付宝 银联等支付方式 不同支付方式的大概流程大抵相似 实现细节有所区别 这个时候就可以用到java的多态机制 先定义一个公共接口 接口定义支付流程的各
  • Java开发:如何将model对象与json互相转换?

    model javabean 与json相互转换 文章声明 model对象与json之间互转网上有很多方法 此处只记录一种常用的 并且比较安全便捷的转换方法 使用gson 一 model转换json 1 首先创建一个model实体类 pac
  • java TreeSet 和 TreeMap 源码解读

    目录 一 前言 二 TreeSet详解 1 TreeSet简介 2 TreeSet的底层实现 0 准备工作 1 TreeSet构造器 2 匿名内部类实现接口的多态 3 TreeMap构造器 4 add方法 5 put方法和put方法 6 继
  • Java进阶--编译时注解处理器(APT)详解

    本文同步发布在掘金 未经本人允许不得转载 上篇文章 Java进阶 Java注解及其实例应用 我们使用注解 反射实现了一个仿ButterKnife功能的示例 考虑到反射是在运行时完成的 多少会影响程序性能 因此 ButterKnife本身并非
  • Java进阶--Java垃圾回收机制全面解析

    本文同步发布在我的个人博客 如需转载请注明出处 提起Java的垃圾回收机制大家应该都有所了解 它不仅是面试的常客 也是Java体系中相当重要的一块知识 深入理解Java的GC机制 不仅有助于我们在开发中提高程序的性能 更有了在面试官面前炫
  • java--进阶--1.1--Dom4j--常用api

    java 进阶 1 1 Dom4j 常用api 代码位置 https gitee com DanShenGuiZu learnDemo tree master Dom4j learn 1 SAXReader类的方法 获取Document 文
  • FutureTask 源码 并发设计模式

    一 代码 https www jianshu com p 60f661d95d53 public static void main String args throws Exception Callable
  • java会话技术--03--Session覆盖问题

    java会话技术 03 Session覆盖问题 代码位置 https gitee com DanShenGuiZu learnDemo tree master sessionCookie learn 1 现象 同一域名 同一个服务 不同的端
  • Java原生代码连接MySQL数据库

    本章我们介绍 如何用java原生代码实现连接MySQL数据库并实现基本的增 删 改 查操作 为了便于演示 首先我们使用Navicat Premium新建一个user表并添加如下数据 我们需要导入连接MySQL所需要的jar包 jdbc驱动包
  • java AbstractOwnableSynchronizer与AbstractQueuedSynchronizer简析

    简介 AbstractQueuedSynchronizer全限定名java util concurrent locks AbstractQueuedSynchronizer 继承自java util concurrent locks Abs
  • NotePad++安装HEX-Editor插件

    在菜单栏点击插件 插件管理 搜索HEX Editor并打钩 点击安装 然后重新打开notepad 会发现工具栏多了一个H的符号 此时点击H 即可以16进制的形式读取当前文件 还是没有的话建议多试几次
  • SpringBoot整合Druid-Mybatis&SpringSecurity使用

    SpringBoot整合JDBC 创建springBoot项目时首先需要导入JDBC的支持 以及MySQL驱动
  • java各种异常总结

    一 java异常汇总 1 Throwable 是所有异常的祖先 Throwable有两个子类 Error和Exception 2 Error是错误 表示运行应用程序中出现了严重错误 都是通过Error抛出的 一般程序无法处理 Excepti

随机推荐

  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Vue中DOM的更新为什么是异步的?

    在 Vue 中 DOM 的更新是异步的机制是为了优化性能和提升用户体验 这个机制被称为 异步更新队列 Vue的异步更新队列机制是其实现高效渲染的关键 它通过将多次数据变化合并到一个批处理中 从而减少了不必要的DOM操作 提高了性能 下面是V
  • costmap 代价地图

    转自 https sychaichangkun gitbooks io ros tutorial icourse163 content chapter10 10 3 html 10 3 costmap costmap是Navigation
  • 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=15873837810484552531 中的...

    coding gbk 嵩天老师的零基础Python笔记 https www bilibili com video av13570243 from search seid 15873837810484552531 中的15 22讲 数字类型的
  • python批量发送带附件的邮件时,收到的附件名异常且后缀为bin,解决办法

    1 问题描述 在使用 Python 内置的模块 smtplib 发送带中文名的附件邮件时 数据可以正常传输 但是但收件人收到的附件格式是bin 附件名也不是发送时的名称 附注 smtp Simple Mail Transfer Protoc
  • 进一步理解angular

    在上一篇文章中我介绍了安装和结构 以及运行过程 https blog csdn net weixin 42603009 article details 94382945 我们进一步理解其中的数据单向 双向 组建传值 Modules等的理解
  • C语言编译过程、VIM常用命令

    一 编译过程 1 预处理 gcc E 源文件 c o 源文件 i 预处理宏以及注释 2 编译 gcc S 源文件 i o 源文件 s 通过编译转换为汇编文件 3 汇编 gcc c 源文件 s o 源文件 o 经汇编转换为二进制文件 4 链接
  • linux创建链接文件

    链接文件的创建 1 概念 链接文件就类似我们windows的快捷方式 只保留目标文件的地址 不占用存储空间 使用链接文件与使用目标文件的效果是一样的 2 为什么要使用链接文件 在windows都会把文件放在一个比较大的磁盘中 我们每次需要使
  • ChatGPT 速通手册——GPT 训练数据集介绍

    GPT 训练数据集介绍 所有人工智能算法都会分为训练和推理两步 算法的效果好坏 很大程度上取决于训练数据本身的质量 ChatGPT 所用的训练数据 openai 公司没有单独公布过细节 不过考虑到 ChatGPT 是在前序 GPT 算法基础
  • linux使用记录(一)

    1 tar 解压tar xvf file tar 解压 tar包 tar xzvf file tar gz 解压tar gz tar xjvf file tar bz2 解压 tar bz2 tar xZvf file tar Z 解压ta
  • 使用ADO.NET访问数据库

    一 ADO NET 数据库访问的方法和技术 二 ADO NEt的重要组件 1 DataSet 独立于数据源的数据访问 2 Net framework数据提供程序 用于连接到数据库执行命令和检索结果 三 NET数据提供程序的四个核心对象 1
  • 无向图——邻接表和邻接矩阵的实现

    邻接矩阵 include
  • 封装七牛云存储工具类

    文章目录 封装七牛云存储工具类 为啥选择七牛云 当然是因为它能免费使用喽 白嫖怪哈哈哈 图片存储方案 Java SDK操作七牛云 封装工具类 封装七牛云存储工具类 为啥选择七牛云 当然是因为它能免费使用喽 白嫖怪哈哈哈 图片存储方案 在实际
  • UnityShader——Compute Shader

    Compute Shader是基于DX11 SM4 5 的在GPU上运行的程序 通过Compute Shader我们可以将大量可以并行的计算放到GPU中计算从而节省CPU资源 Unity 5 6版本提供的 Graphics DrawMesh
  • U盘数据丢失是什么原因?轻松让U盘数据恢复的教程

    在数字化时代 我们不可避免地使用各种便携式存储设备 如U盘 来传输和存储重要数据 然而 有时我们可能不小心删除了U盘中的文件 或者格式化了U盘等等而导致数据丢失 这种情况下 你可能会困惑地想知道 是否有简单的方式可以快速而轻松地恢复U盘中丢
  • 解决报错:You don‘t have enough free space in /var/cache/apt/archives/.

    apt安装package时遇到问题 You don t have enough free space in var cache apt archives 问题 var 目录下空间不足 apt下载时没有地方存放缓存文件 解决方法 删除部分日志
  • Java中解决CAS机制出现的ABA问题

    Java中解决CAS机制出现的ABA问题 学习目标 Java中解决CAS机制出现的ABA问题 1 先了解一下什么是CAS 2 CAS的底层原理 3 CAS的问题 4 怎么解决ABA问题 1 先了解一下什么是CAS 一句话总结就是 比较并交换
  • 分库分表需要考虑的问题及方案

    转自 http www jianshu com p 32b3e91aa22c from timeline 分库分表需要考虑的问题及方案 作者 jackcooper 2017 02 08 16 08 字数 5042 阅读 5240 评论 3
  • 【手写一个RPC框架】simpleRPC-06

    目录 前言 实现 zookeeper安装与使用 项目创建 依赖配置 register client service server common codec 文件结构 运行 本项目所有代码可见 https github com weiyu z
  • Lock锁和Condition条件

    Lock的特性 Lock不是Java语言内置的 synchronized是在JVM层面上实现的 如果代码执行出现异常 JVM会自动释放锁 但是Lock不行 要保证锁一定会被释放 就必须将unLock放到finally 中 手动释放 在资源竞