4.显式锁 Lock
4.1 概念
内置锁 vs 显示锁
synchronize是java语言层面实现的锁,称为内置锁。使用方便代码简洁,而且在jdk新版本优化后,性能也得到了很大的提高。synchronize是一个可重入锁。而Lock是jdk提供开发者是用的一个显式锁。通过lock()和unlock()方法加锁和释放锁。
可重入锁 vs 不可重入锁
可重入的意思是指持有锁的线程在某种情况下,例如递归方式调用自身,此时不需要重新获得所,而是给内部维护的一个state值加1,每次方法出栈后state值减1,直到state值为0,锁被释放。
公平锁 vs 非公平锁
公平锁的含义是在并发环境,每个线程获取锁的时候,会先检查锁维护的线程等待队列,如果等待队列为空或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己;非公平锁含义是在并发环境中,不理会等待队列中是否有等待的线程获取锁,允许插队,只要当前线程是available就可以占有锁,如果尝试失败,就再采用类似公平锁那种方式。ReentrantLock在创建的时候可以指定是公平锁还是非公平锁。不指定默认是非公平锁。而且一般认为非公平锁效率更好。
读锁 vs 写锁
读写锁一般是指ReentrantReadWriteLock类,通过该类的内置类变量:readerLock和writeLock可以分别获取读锁和写锁。其实ReadLock和WriteLock,从继承关系可以看出,也是实现了Lock接口,也是显示锁的一种。在什么情况下使用读写锁呢?答案是读多写少的情况。
/** Inner class providing readlock */
private final ReentrantReadWriteLock.ReadLock readerLock;
/** Inner class providing writelock */
private final ReentrantReadWriteLock.WriteLock writerLock;
4.2 ReentrantLock源码解读
- ReentrantLock实现了Lock接口,本身就是一个显式锁。
- ReentrantLock内含一个Syn类,该类实现了AbstractQueuedSynchronizer.ReentrantLock是基于AQS实现的。
4.显式锁 Lock的更多相关文章
- “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- java线程基础巩固---如何实现一个自己的显式锁Lock
拋出synchronized问题: 对于一个方法上了同锁如果被一个线程占有了,而假如该线程长时间工作,那其它线程不就只能傻傻的等着,而且是无限的等这线程工作完成了才能执行自己的任务,这里来演示一下这种 ...
- Java 实现一个自己的显式锁Lock(有超时功能)
Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 显式锁(三)读写锁ReadWriteLock
前言: 上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock. ...
- 六、显式锁和AQS
显式锁和AQS 一.显式锁 Synchronized 关键字结合对象的监视器,JVM 为我们提供了一种『内置锁』的语义,这种锁很简便,不需要我们关心加锁和释放锁的过程,我们只需要告诉虚拟机哪些代码 ...
- java之AQS和显式锁
本次内容主要介绍AQS.AQS的设计及使用.ReentrantLock.ReentrantReadWriteLock以及手写一个可重入独占锁 1.什么是AQS? AQS,队列同步器AbstractQu ...
- Java并发-显式锁篇【可重入锁+读写锁】
作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置锁synchronized: 这节我们再介绍下显式锁Lock 显式锁包括:可重入锁ReentrantLock.读写 ...
随机推荐
- Requests接口测试(二)
requests安装先看下怎么安装requests, 执行以下命令: pip install requests 安装好后如何导入requests模块呢? 如下所示: import requests 基 ...
- py_initialize:C调Python出错 是初始化错误?
还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...
- asp.net winform 界面传值
第一种 //form1 //静态传值 public static string Chuanzhi; string Chuanzhi = textbox.text; //form2 string Chu ...
- Vue 父组件主动获取子组件的值,子组件主动获取父组件的值
父组件主动获取子组件的值 1. 在调用子组件的时候定义一个ref-> ref="header"2. 在父组件中通过this.$refs.header.属性,调用子组件的属性, ...
- asp.net mvc 请求处理流程,记录一下。
asp.net mvc 请求处理流程,记录一下.
- 5种banner
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <tit ...
- StringUtils常用方法介绍
要使用StringUtils类,首先需要导入:import org.apache.commons.lang.StringUtils;这个包 在maven项目中需要添加下面这个依赖: <depen ...
- jenkins html报告不显示样式
解决办法: 1.安装Startup Trigger,在jenkins节点启动时触发构建: 2.安装Groovy,直接运行Groovy代码: 3.新建一个Job,用于jenkins启动时执行配置命令: ...
- day08.3-apache网页服务
1. 安装软件:yum install httpd -y 2. 查看配置文件:vim /etc/httpd/conf/httpd.cof,其中,"Listen 80&qu ...
- cf555e
cf555e(缩点) 给一个 n 个点 m 条边的图,以及 q 对点 (s,t),让你给 m 条边定向.问是否存在一种方案,使每对点的 s 能走到 t. \(n,m,q≤ 2×10^5\). 首先,在 ...