接口Lock的实现类:

ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

ReentrantLock

java5.0之前只有synchronize和volatile,ReentrantLock是5.0增加的。

ps:synchronize使用的监视器锁不是通过ReentrantLock实现的,是一种独特的机制。在5.0中它的性能要比ReentrantLock低很多,在6.0中它的性能也比ReentrantLock也要低一点。

ReentrantLock的独有功能:

  • 可实现轮询
  • 可配置为定时返回
  • 可配置为响应中断
  • 可配置为公平锁

注意:lock的unlock必须在finally中。

轮询和定时都是通过tryLock(time)方法来实现的。

while(true)

{

boolean success = lock.tryLock(time);

if success

{

//获得了锁

//执行代码

break;

}

}

关于公平锁:

此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁定倾向于将访问权授予等待时间最长的线程。否则此锁定将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁定)相比,使用公平锁定的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁定和保证锁定分配的均衡性时差异较小。不过要注意的是,公平锁定不能保证线程调度的公平性。还要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁定是可用的,此方法就可以获得成功。

synchronize和ReentrantLock的选择

ReentrantLock在性能上似乎优于内置锁,但是内置锁仍然具有很大的优势。内置锁为许多开发人员所熟悉,并且简介紧凑,而且许多现有的程序都已经使用了内置锁,如果将这两种机制混合使用,那么不仅容易令人困惑,也容易发生错误。

而且synchronize更加的简单,JVM会对它有特殊的优化。

所以作者建议优先选择synchronize。

读写锁

写锁独占读写操作。读锁之间可以共享。

读写锁本身的实现会有负担,所以一般在读操作比较多的情况下使用。如果不是这种情况,最好测试后再做决定。

ReentrantReadWriteLock:

此类具有以下属性:

  • 获取顺序

当设置为公平锁时,线程利用一个近似到达顺序的策略来争夺进入。当释放写入锁定后,将写入锁定分配给等待时间最长的单个写入者,如果有一个等待时间比所有写入者更长的读取者,则将读取锁定分配给读取者 set。当非公平地构造线程时,则不需要按照到达顺序进入锁定。不管是哪一种情况,如果读取者处于活动状态,而某个写入者进入锁定状态,那么在获取写入者并释放写入锁定之前,不会将读取锁定授予任何后续的读取者。我的理解:也就是说,写入锁具有优先获取锁的特权,虽然在公平锁的情况下,这个特权会削弱,但是依然有。

  • 重入

此锁定允许读取者和写入者按照 ReentrantLock 的样式重新获取读取锁定或写入锁定。在写入线程保持的所有写入锁定都已经释放后,才允许写入者使用它们。

  • 锁定降级

重入还允许从写入锁定降级为读取锁定,其实现方式是:先获取写入锁定,然后获取读取锁定,最后释放写入锁定。但是,从读取锁定升级到写入锁定是不可能的。

  • 锁定获取的中断

读取锁定和写入锁定都支持锁定获取期间的中断。

  • Condition 支持

写入锁定提供了一个 Condition 实现,对于写入锁定来说,该实现的行为与 ReentrantLock.newCondition() 提供的 Condition 实现对 ReentrantLock 所做的行为相同。当然,此 Condition 只能用于写入锁定。

读取锁定不支持 Condition,readLock().newCondition() 会抛出 UnsupportedOperationException。

  • 序列化

此类行为的序列化方式与内置锁定的相同:反序列化的锁定处于解除锁定状态,无论序列化该锁定时其状态如何。

转载于:https://www.cnblogs.com/xiaolang8762400/p/7074392.html

Java并发编程实战 第13章 显式锁相关推荐

  1. Java并发编程实战 第4章 对象的组合

    Java监视器模式 java监视器模式就是在将共享的数据封装在一个类里面,然后然后所有访问或者修改这些数据的方法都标注为synchronize. 车辆追踪模拟: 使用监视器模式: CarTracker ...

  2. JAVA并发编程实战---第三章:对象的共享(2)

    线程封闭 如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一.当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线 ...

  3. java并发编程实战-第三章-对象的共享

    3.1可见性 首先我们需要知道的是,java的线程都有自己独立的缓存,线程之间进行共享变量的交互是通过自身和缓存和主存的交互实现的. 如果线程的每次更改缓存都刷入主存,主存每次被一个线程的缓存修改,都 ...

  4. JAVA并发编程实战---第三章:对象的共享

    在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程序中,要对内存操作的执行顺序进行判断几乎无法得到正确的结果. 非原子的64位操作 当 ...

  5. Java并发编程实战 第14章 构建自定义的同步工具

    状态依赖性 定义:只有满足特定的状态才能继续执行某些操作(这些操作依赖于固定的状态,这些状态需要等待别的线程来满足). FutureTask,Semaphroe,BlockingQueue等,都是状态 ...

  6. Java并发编程实战————可重入内置锁

    引言 在<Java Concurrency in Practice>的加锁机制一节中作者提到: Java提供一种内置的锁机制来支持原子性:同步代码块."重入"意味着获取 ...

  7. 《Java并发编程实战》【第一部分 基础知识】

    文章目录 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线 ...

  8. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  9. Java并发编程实战————Executor框架与任务执行

    引言 本篇博客介绍通过"执行任务"的机制来设计应用程序时需要掌握的一些知识.所有的内容均提炼自<Java并发编程实战>中第六章的内容. 大多数并发应用程序都是围绕&qu ...

最新文章

  1. 面试题05-UI控件
  2. Ubuntu 16.04下Caffe-SSD的应用(五)——安装VOC数据标注工具LabelImag
  3. 计算机网络(一)计算机网络概述、组成、功能分类、性能指标 | 思维导图
  4. arduinoesp8266定时器_esp8266定时开关,远程控制
  5. java swing 组件技术(上)
  6. 腾讯云TStack,带着“数据中心”游云南
  7. PC寄存器为什么会被设定为线程私有
  8. JavaScript历史与ECMAScript
  9. C#LeetCode刷题-几何
  10. Apache Flink OLAP引擎性能优化及应用
  11. scanner 获取控制台信息_Java使用Scanner类进行控制台输入实现方法
  12. web的case点总结
  13. jquery获取父级元素和子级元素
  14. Enterprise Library - Security Application Block 学习手册(最新版) Part 1
  15. ArcGIS学习总结(18)——面要素/矢量拆分
  16. jenkins 2.121.1 部署项目
  17. 玄奥八字V5.6 爆破实例2
  18. 老虎淘客系统淘宝平台无法生成淘口令问题如何解决?
  19. Xcode6解决storyboard没有箭头的问题
  20. Android 10(Q)GMS(cts/vts/gts)认证总结

热门文章

  1. java怎么设有滚动的标签,html标签overflow属性和javascript实现div标签滚动
  2. 数组的最长平台c语言,2010台湾省C语言版高级
  3. bp神经网络代码_精通数据科学笔记 神经网络
  4. 【若依(ruoyi)】按钮样式
  5. 【Mybatis】 mapper XML 文件中使用 association 实现一对一关联
  6. bagging和时间序列预测_时间序列的LSTM模型预测——基于Keras
  7. java 设计模式_快速上手Java设计模式之简介
  8. unity 下一帧执行_理解Unity中的优化(三):协程(Coroutines)
  9. java system_java System类
  10. 地理必修一三大类岩石_高一地理必修一知识点总结归纳