JavaSE---显式锁
1、概述
1.1、jdk5之前,用于 调节共享对象访问机制 只有 synchronized、volatile;
jdk5之后,提供了 显示锁:Lock、ReentrantLock...;
显式锁 并不是 内部锁机制 的替代,而是 当内部锁被证明受到局限时,提供可选择的高级特性;
1.2、Lock接口
1.2.1、Lock接口,定义了 一些 抽象的锁操作;
与内部锁机制不同,Lock 提供了 无条件的、可轮询、定时、可中断 的 锁获取操作;
所有的加锁、解锁都是 显式的;
1.2.2、Lock的实现 提供了 与 内部锁 相同的内存可见性;
但 加锁的语义、调度算法、顺序保证、性能特征 与内部锁不同;
1.3、ReentrantLock接口
1.3.1、ReentrantLock 实现了 Lock 接口,提供了 与 synchronized 相同的互斥、内存可见性;
1.3.2、为何要创建与内部锁如此相似的机制?
内部锁 大部分情况下 能很好地工作,但是 有一些功能上的局限(不能中断 那些正在 等待获取锁的线程,且 请求锁失败的情况下,必须无限等待);
1.3.3、注意事项:
a,锁 必须 在finally 块中释放;
b,如果 锁守护的代码 在 try块之外抛出异常,它将 永远不会被释放了;
1.3.4、可轮询、可定时的锁获取
I、可定时、可轮询的锁获取,由 tryLock()实现;
与 无条件的 锁获取 相比,它具有更完善的错误恢复机制;
II、可定时、可轮询的锁获取,可以避免 死锁 的发生(在内部锁中,死锁是致命的,唯一的恢复方法是重启应用程序,构建程序时不允许出错);
III、对于实现那些 具有时间限制 的活动,定时锁同样非常有用;
1.3.5、可中断的锁获取
I、可中断的锁获取 允许 在可取消的活动中使用;
II、当你 正在响应中断的时候,lockInterrupter()能够使你获取锁,且 它是内置于 Lock的,不需要再创建其他种类不可中断的阻塞机制;
1.3.6、非块结构的锁
I、???
2、锁的性能
2.1、内部锁(synchronized) 与 显式锁(Lock) 的性能和可伸缩性 是基于平台的,比如:CPU、处理器数量、高速缓存大小、JVM特性...;
3、锁的公平性
3.1、ReentrantLock 构造函数 提供了 2种公平性的选择:
a,非公平锁(默认)
I、线程的请求可以 在等待线程的队列中向前跳跃,获得该锁;
II、线程只有当锁被占用时才会等待;
b,公平锁
I、如果锁已被线程占用,新的线程请求会加入到等待队列,线程必须 按顺序获取;
4、synchronized与ReentrantLock选择
4.1、在内部锁不能满足使用时,ReentrantLock才被作为更高级的工具;
4.2、当你需要以下高级特性时,才应该使用:
a,可定时、可轮询的锁获取;
b,可中断的锁获取;
c,公平队列;
d,非块结构的锁;
5、读写锁
5.1、ReentrantLock实现了标准的互斥锁(一次最多只有一个线程能够持有相同的lock);
5.2、互斥锁 过分地限制了并发性,避免了"写/写"、"写/读"、"读/读"操作;
读写锁 :一个资源可 被多个读者访问(或 被一个写者访问 [2者不能同时进行]);
5.3、jdk提供了 ReadWriteLock、ReentrantReadWriteLock:
a,ReentrantReadWriteLock 提供了 可重入的加锁语义;
b,ReentrantReadWriteLock 可被 构造为 非公平、公平锁:
公平锁:
选择权 交给 等待时间最长的线程;
如果 锁由读者获得,而 另一个线程请求写入锁,那么 不允许读者获得读取锁,直到 写者被受理,且已释放写入锁;
非公平锁:
线程运行访问的顺序不定;
由 写者降级为读者 允许的,读者升级为写者不允许;
c,ReentrantReadWriteLock 的 写入锁 有 唯一的所有者 , 且 只能被 获得了该锁的线程释放;
JavaSE---显式锁的更多相关文章
- 深入理解Java内置锁和显式锁
synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...
- Java并发编程之显式锁机制
我们之前介绍过synchronized关键字实现程序的原子性操作,它的内部也是一种加锁和解锁机制,是一种声明式的编程方式,我们只需要对方法或者代码块进行声明,Java内部帮我们在调用方法之前和结束时加 ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java编程的逻辑 (71) - 显式锁
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 显式锁(二)Lock接口与显示锁介绍
一.显式锁简介 显式锁,这个叫法是相对于隐式锁synchronized而言的,加锁和解锁都要用户显式地控制.显示锁Lock是在Java5中添加到jdk的,同synchronized一样,这也是一 ...
- 显式锁(三)读写锁ReadWriteLock
前言: 上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock. ...
- 显式锁(四)Lock的等待通知机制Condition
任意一个Java对象,都拥有一组监视器方法(定义在根类Object上),主要包括:wait( ).wait(long timeout).notify().notifyAll()方法:这些方法与关 ...
随机推荐
- 系统编码 python编码
编码一直都是一个很让人头疼的问题,尤其是在python里面.花了几天时间,终于把这个问题给弄明白了. 一,什么是编码,编码过程是怎样的?常见的编码方式有哪些? 编码是从一个字符,比如'哈',到一段二进 ...
- 将ubuntu系统录到u盘上
可以使用bootice工具对u盘分区,并隐藏,然后把系统录到隐藏分区,ubuntu只需要1.5G即可.bootice很强大 录制工具可选的有Universal USB Install.UltraISO ...
- 你知道 Git 是如何做版本控制的吗?(转)
总结:阅读这篇文章需要20分钟 本文是转载自 滴滴WebApp架构组 的一篇文章,文章讲解了神秘的.git目录下的一些文件,最终阐述了git是如何存储数据,及git分支的相关内容. git如何存储数据 ...
- Python学习之==>文件操作
1.打开文件的模式 r,只读模式(默认)[不可写:文件不存在,会报错] w,只写模式[不可读:不存在则创建:存在则删除内容] a,追加模式[不可读:不存在则创建:存在则追加内容] r+,读写模式[可读 ...
- 【SpringMVC】---搭建框架步骤
项目如下 一.加入 Jar 包 部分jar包可以不导(第4.9.11个可以不导入) 二.在 Web.xml 中配置 DispatcherServlet <?xml version="1 ...
- Web UI自动化测试基础——元素定位(二)
本篇文章整理了元素定位的基础知识——多个元素定位方式. 一.多个元素定位方式简介 同单个元素定位方式相同,多个元素定位方式也有与之对应的8种方式,即id.name.class_name.tag_nam ...
- sentos7忘记root密码,重置密码
一.两种模式:单用户模式和救援模式 下面示例救援模式 1.重启linux系统主机并出现引导界面,按e键进入内核编辑界面: 2.在linux16参数那一行的最后面追加“rd.break”参数,记住要空开 ...
- Flask框架(一)—— Flask简介
Flask框架(一)—— Flask简介 目录 Flask框架介绍 一.Flask简介 二.flask安装与使用 1.安装 2.使用 3.简单案例——flask实现用户登录 Flask框架介绍 一.F ...
- Quartz-第三篇 quartz-misfire 错失,补偿执行
1.问题:使用pauseJob()后,再使用resumeJob(). Job如果中间时间足够短,默认会将之前错失的次数执行回来.这个问题的原因是执行调度策略的问题,quartz框架默认会将错失的执行次 ...
- CentOS下搭建docker+.net core
运行环境: CentOS 7.0 容器:Docker 1.13.1 .Net Core版本: .NET Core 2.1,安装详见 CentOS 7 下安装.NET Core SDK 2.1 1.安装 ...