第十三章 ReentrantLock 简介
Java 5.0 提供的新的加锁机制:当内置加锁机制不适合时 , 作为一种可选择的高级功能
一个可重入的互斥锁 Lock
,它具有与使用 synchronized
方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。
13.1 Lock 与 ReentrantLock
Lock 中实现的必须提供与内置锁相同的内存可见
性语义, 但在加锁语义,调度算法,顺序保证和性能特性方面有所不同.
13.1.1 轮询锁和定时锁
在内置锁中, 解决死锁的唯一方法是 重新启动程序. 防止死锁的唯一方法是 构造程序时避免出现不一致的锁顺序(互相等待).
避免死锁的方法 :
通过定时或轮询的方式去获取锁 : 如果不能获得所有需要的锁, 则释放所有已经获得的锁. 然后重新尝试获取所有锁.
内置锁在请求锁之后 ,此操作无法取消.
13.1.2 可中断的锁获取操作
不可中断的阻塞机制使得任务的取消变得复杂.
tryLock() 方法可实现定时的和可中断的所获取操作.
13.1.3 非块结构的加锁
内置锁中, 进入synchronize 代码块自动加锁, 执行完代码块自动释放锁. 锁的获取与释放在同一代码块中. 简化了程序的分析, 但缺少一定的灵活性.
显示锁中, 加锁操作和释放锁操作可以不在同一个代码块中 , 提高的锁的灵活性 . 但是也带来一定的危险性(比如忘了释放锁)
通过降低锁的粒度可以提高代码的可伸缩性.
锁分段技术: 在基于散列的容器中实现不同的散列链, 以便使用不同的锁.
可采用类似的原则降低链表中锁的粒度 .
连锁式加锁或者锁耦合 : 对链表的每个节点加锁, 操作此节点时必须拥有此节点的锁, 只有获取到下个节点的锁时才释放上个节点的锁.
13.2 锁的性能
Java 5.0 中, 多线程环境下 显示锁的性能优于内置锁.
Java 6.0 中, 内置锁使用类似与显示锁的算法进行优化, 两者的性能 基本接近.
13.3 公平性
ReentrantLock 在构造时可选择使用公平锁和非公平锁.
- 公平锁中, 若有线程持有锁或有其他线程在队列中等待这个锁, 则新发出请求这个锁的线程将被放入队列中.
- 非公平锁中, 只有当锁被某个线程持有时, 新发出请求锁的线程才会被放入队列中.
- 公平锁由于线程的挂起和恢复的开销(线程从挂起状态到恢复运行状态需要一定的时间)而极大的降低性能..
- 非公平时可能在某个线程在其它线程争抢锁之前就已经锁的使用,这样并不影响其它线程的使用,提高了性能
选择 : 当持有锁的时间相对较长或者请求锁的平均时间间隔较长时可选择使用 公平锁
13.4 synchronize 和 ReetrantLock
- 仅当内置锁不满足需求时才考虑使用显示锁.
- 内置锁在线程转储中能给出在哪些调用帧中获得了哪些锁 , 并能够检测和识别发生死锁的线程. 而显示锁不可以
- synchronize 是JVM的内置属性, 优化方面更加方便. 推荐使用内置锁.
13.5 读---写锁(ReadWriteLock)
- 一个资源科被多个读操作访问, 或者被一个写操作访问. 但两者不能同时进行.
- 非公平模式 : 连续竞争的非公平锁可能无限期地推迟一个或多个 reader 或 writer 线程,但吞吐量通常要高于公平锁。
- 公平模式 : 当释放当前保持的锁时,可以为等待时间最长的单个 writer 线程分配写入锁,如果有一组等待时间大于所有正在等待的 writer 线程 的 reader 线程,将为该组分配写入锁(防止公平模式下写线程饥饿)
- 重入还允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的。
第十三章 ReentrantLock 简介的更多相关文章
- perl5 第十三章 Perl的面向对象编程
第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
- 【书评:Oracle查询优化改写】第五至十三章
[书评:Oracle查询优化改写]第五至十三章 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...
- PRML读书会第十三章 Sequential Data(Hidden Markov Models,HMM)
主讲人 张巍 (新浪微博: @张巍_ISCAS) 软件所-张巍<zh3f@qq.com> 19:01:27 我们开始吧,十三章是关于序列数据,现实中很多数据是有前后关系的,例如语音或者DN ...
- <构建之法>第十三章到十七章有感以及这个项目读后感
<构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...
- Windows程序设计(第五版)学习:第二章 Unicode简介
第二章 Unicode简介 1,Windows通过双字节技术DBCS解决这个问题,代码页定义不同的字符集,称为ANSI字符集,比如日文为CP932,韩文为CP949,繁体中文为CP950,简体中文为C ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
- 《深入浅出Node.js》第1章 Node简介
@by Ruth92(转载请注明出处) 第1章 Node简介 一.Node的起源 高性能Web服务器的要点:事件驱动.非阻塞I/O. 选择JavaScript的原因:高性能.符合事件驱动.没有历史包袱 ...
- 第一章 C++简介
第一章 C++简介 1.1 C++特点 C++融合了3种不同的编程方式:C语言代表的过程性语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程. 1.2 C语言及其编程 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
随机推荐
- Django框架之验证码生成示例
一.生成随机颜色的图片 1)前端代码展示 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- Linux网桥模式配置
Linux网关模式下将有线LAN和无线LAN共享网段实现局域网内互联: 思路其实很简单:就是将虚拟出一个bridge口,将对应的有线LAN和无线LAN都绑定在这个虚拟bridge口上,并给这个brid ...
- 2018.11.07 NOIP模拟 数独(模拟)
传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码
- 将驼峰转化为下化线(将型如AbcDef转化为abc_def)
strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', 'AbcDef'))
- FASTDFS 安装与开发
FASTDFS介绍 FastDFS开源地址:https://github.com/happyfish100 简介 FastDFS 是一个开源的高性能分布式文件系统(DFS). 它的主要功能包括:文件存 ...
- PLSQL Developer对oracle中的数据进行备份恢复
1.备份数据结构 --进入 工具-->导出用户对象 如图所示 把包括所有者的√去掉,到时候我们就可以随便建一个用户导入数据了,不一定非要scott用户 2.备份数据 工具-->导出 ...
- 2-具体学习Github---init add commit log diff
1.安装: 首先找到git的官网,内部有下载链接. 也可以用下面的,我的是win7的64位系统: 可以在此处下载:Git-2.13.0-64-bit.exe链接:http://pan.baidu.co ...
- idea设置字体大小
第一次玩儿idea,也是个新手小白,甚是惭愧,也是一步步慢慢摸索,下面我们按照步骤一步步操作 就可以了. 1.首先,先设置代码的字体大小: 2.设置周围菜单栏的字体大小: 3.设置控制台的字体大小:
- hashchange事件
h5新增了hashchange事件,以便在URL参数列表(及URL中‘#’号后面的所有字符串),发生变化时通知开发人员. 之所以要添加这个事件,是因为在Ajax应用中,开发人员经常要利用URL参数列表 ...
- DDR II中的延时参数
CL (CAS latency) CL是从读命令发出到有效数据到DDR端口的延时,以时钟为单位.下图分别表示CL = 3和CL = 4的两种情况, 如果读命令在第n个时钟周期发出,CL = m,则读 ...