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 简介的更多相关文章

  1. perl5 第十三章 Perl的面向对象编程

    第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...

  2. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  3. PRML读书会第十三章 Sequential Data(Hidden Markov Models,HMM)

    主讲人 张巍 (新浪微博: @张巍_ISCAS) 软件所-张巍<zh3f@qq.com> 19:01:27 我们开始吧,十三章是关于序列数据,现实中很多数据是有前后关系的,例如语音或者DN ...

  4. <构建之法>第十三章到十七章有感以及这个项目读后感

    <构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...

  5. Windows程序设计(第五版)学习:第二章 Unicode简介

    第二章 Unicode简介 1,Windows通过双字节技术DBCS解决这个问题,代码页定义不同的字符集,称为ANSI字符集,比如日文为CP932,韩文为CP949,繁体中文为CP950,简体中文为C ...

  6. 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记

    第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...

  7. 《深入浅出Node.js》第1章 Node简介

    @by Ruth92(转载请注明出处) 第1章 Node简介 一.Node的起源 高性能Web服务器的要点:事件驱动.非阻塞I/O. 选择JavaScript的原因:高性能.符合事件驱动.没有历史包袱 ...

  8. 第一章 C++简介

    第一章  C++简介 1.1  C++特点 C++融合了3种不同的编程方式:C语言代表的过程性语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程. 1.2  C语言及其编程 ...

  9. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

随机推荐

  1. HierSort(希尔)————Java

    利用Java进行希尔排序(元素中有0会有问题),步长经过调试length/2+1最合适. import java.util.Scanner; public class HierSort { priva ...

  2. 绩效沟通-BEST原则

    BEST原则指在进行绩效/IDP面谈的时候按照以下步骤进行: 案例:小赵经常在制作标书时候犯错误 Behavior description 描述行为 小赵,8月6日,你制作的标书,报价又出现了错误,单 ...

  3. 2019.01.21 洛谷P3919 【模板】可持久化数组(主席树)

    传送门 题意简述:支持在某个历史版本上修改某一个位置上的值,访问某个历史版本上的某一位置的值. 思路: 用主席树直接维护历史版本即可. 代码: #include<bits/stdc++.h> ...

  4. 2018.11.08 NOIP模拟 班车(倍增+dfs+bit)

    传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果 ...

  5. 开启笔记本win7的虚拟热点笔记本变成wifi

    工具/原料 windows 7电脑一台 步骤/方法 1 开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费 ...

  6. 20145232 韩文浩 《Java程序设计》第8周学习总结

    教材学习内容总结 14 NIO与NIO2 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rewind(),flip(),compact()等高级操作. 想要取得c ...

  7. Qt_技巧_将Qt动态链接生成的exe与dll打包方法

    刚开始接触Qt,发现mac平台直接release编译一下就能够直接生成.app文件,并且可以直接运行..app位于工程文件内. 同样发方法在Windows直接运行exe却出现缺失dll情况. 讲过网上 ...

  8. MySQl数据约束练习

    默认值约束   1 CREATE TABLE USER( 2 uid INT, 3 uname VARCHAR(10), 4 address VARCHAR(30) DEFAULT '山东省' 5 ) ...

  9. hadoop的两大核心之一:HDFS总结

    什么是HDFS? hadoop distributed file system(hadoop分布式文件系统) 是一种允许文件通过网络在多台主机上分享的文件系统, 可让多机器上的多用户分享文件和存储空间 ...

  10. POJ3666 线性dp_离散化_贪心

    POJ3666 线性dp_离散化_贪心 就DP而言这个题不算难,但是难就难在贪心,还有离散化的思想上 题目大意:n个土堆,问你最少移动多少单位的图,可以使得这n个土堆变成单调的 dp[i][j]表示前 ...