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. 数据分析报告格式zz

    分析报告的输出是是你整个分析过程的成果,是评定一个产品.一个运营事件的定性结论,很可能是产品决策的参考依据,既然这么重要那当然要写好它了. 我认为一份好的分析报告,有以下一些要点: 首先,要有一个好的 ...

  2. Hadoop3集群搭建之——hive添加自定义函数UDTF

    上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoo ...

  3. PHP中的__get()和__set()方法获取设置私有属性

    在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...

  4. 219.01.19 bzoj3252: 攻略(长链剖分+贪心)

    传送门 长链剖分好题. 题意:给一棵带点权的树,可以从根节点到任一叶节点走kkk次,走过的点只能计算一次,问kkk次走过的点点权值和最大值. 思路: 考虑将整棵树带权长链剖分,这样链与链之间是不会重复 ...

  5. 2019.01.19 codeforces343D.Water Tree(树剖+ODT)

    传送门 ODTODTODT板子题. 支持子树01覆盖,路径01覆盖,询问一个点的值. 思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去. 注意修改路径时每次跳重链都要修改. ...

  6. JS将时间戳转化为时间

    //将时间戳转化为时间 function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1 ...

  7. ICMP协议、DNS、ARP协议、ping、DHCP协议

    1.ICMP协议 1)ICMP协议,即:网络控制消息协议(Internet Control Message Protocol) 2)ICMP是网络层协议,因为ICMP报文是装在IP数据报中,作为它的数 ...

  8. IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis+Redis处理高并发,穿透问题

    一.当采用reddis缓存的时候,如果同时,一万次访问,那么就会有10000次访问数据库所以就会对数据库造成巨大压力,这时候,就要用到线程 1.方法体上加锁(优点,防护住了并发锁,缺点降低了内存效率) ...

  9. java web 怎么下载大文件(上百M)

    Java代码   ; ]; , )) != -) { , bytesRead); 13.               } 14.               toClient.write(buffer ...

  10. 阿里云oss如何上传一个文件夹

    最近公司在做工程项目,实现文件夹云存储上传 网上找了很久,发现很多项目都存在一些问题,但还是让我找到了一个成熟的项目. 工程: 对项目的文件夹云存储上传功能做出分析,找出文件夹上传的原理,对文件夹的云 ...