`
zhouchaofei2010
  • 浏览: 1086327 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java并发编程实战-第13章-显示锁

阅读更多

java并发编程实战-第13章-显示锁

 Lock interface:

 

 方法摘要 

 void lock() 

          获取锁。 

 void lockInterruptibly() 

          如果当前线程未被中断,则获取锁。 

 Condition () 

          返回绑定到此 Lock 实例的新 Condition 实例。 

 boolean tryLock() 

          仅在调用时锁为空闲状态才获取该锁。 

 boolean tryLock(long time, TimeUnit newConditionunit) 

          如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。 

 void unlock() 

          释放锁。 

 

 

 Unlike intrinsic locking, Lock offers a choice of unconditional, polled, timed, and interruptible lock acquisition, and all lock and unlock operations are explicit

  无条件的、可轮询的、基于时间的和可中断的 ,并且加锁和解锁都是显示的。

13.1 Lock and ReentrantLock

13.1.1 . Polled and Timed Lock Acquisition

  如果不能获得所需要的所有锁,那么可以使用定时的或者轮询的锁获取方式,从而重新获取控制权,首先释放所有已获得的锁,然后重新尝试获取所有锁。

  

  比如用来解决动动顺序死锁问题。清单13-3 transferMoney

  

  

  

  基于时间的发送消息,如果在时间段里没有获取到锁,则会优雅的失败。

  

  Listing 13.4. Locking with a Time Budget.

public boolean trySendOnSharedLine(String message,

                                   long timeout, TimeUnit unit)

                                   throws InterruptedException {

    long nanosToLock = unit.toNanos(timeout)

                     - estimatedNanosToSend(message);

    if (!lock.tryLock(nanosToLock, NANOSECONDS))

        return false;

    try {

        return sendOnSharedLine(message);

    } finally {

        lock.unlock();

    }

}

 

 

 

 

  

13.1.2 Interruptible Lock Acquisition

 

  interruptible lock acquisition allows locking to be used within cancellable activities

  

  Listing 13.5. Interruptible Lock Acquisition.

 

public boolean sendOnSharedLine(String message)

       throws InterruptedException {

   lock.lockInterruptibly();

   try {

       return cancellableSendOnSharedLine(message);

   } finally {

       lock.unlock();

   }

}

 

private boolean cancellableSendOnSharedLine(String message)

   throws InterruptedException { ... }

 

13.1.3. Non-block-structured Locking

(以下内容再自jdk1.6)

虽然 synchronized 方法和语句的范围机制使得使用监视器锁编程方便了很多,而且还帮助避免了很多涉及到锁的常见编程错误,但有时也需要以更为灵活的方式使用锁。例如,某些遍历并发访问的数据结果的算法要求使用 "hand-over-hand" 或 "chain locking":获取节点 A 的锁,然后再获取节点 B 的锁,然后释放 A 并获取 C,然后释放 B 并获取 D,依此类推。Lock 接口的实现允许锁在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁,从而支持使用这种技术。 

 

随着灵活性的增加,也带来了更多的责任。不使用块结构锁就失去了使用 synchronized 方法和语句时会出现的锁自动释放功能。在大多数情况下,应该使用以下语句: 

 

     Lock l = ...; 

     l.lock();

     try {

         // access the resource protected by this lock

     } finally {

         l.unlock();

     }

 

 

13.2. Performance Considerations

 

   通过synchronized 和ReentrantLock  在jdk1.5 和1.6 中比较,

   

   在1.5中,synchronized会随着竞争的加剧,而性能减小,但在1.6中情况完全不同。已经和ReentrantLock性能相当

  

  

   所以,性能是个不断变化的指标,昨天的测试今天可能就过时了

   

 

13.3 公平性

 

    ReentrantLock  和 ReentrantReadWriteLock  的默认都是非公平的锁,这样可以提高并发的性能 。公平性将由于存在挂起线程和恢复线程时存在开销而极大的降低性能。

    

   非公平的锁中,如果一个新线程请求资源,并且该资源可用时,可以插队直接获取改资源的锁。而在公平锁中,如果有另外一个线程持有该锁,或者有其他线程在队列中等待这个锁,那么新发出请求的线程会被放入队列中。

13.4 ReentrantLock 和 内置锁的选择

    优先使用内置锁,当内置锁不能提供额为的功能时,再考虑ReentrantLock,这些功能包括:可轮询、定时、可取消 和 提供公平性时 

    

13.5   读写锁

 

     在读多写少的数据结构时,可以提高程序的并发性

      可以包裹 HashMap  ,ArrayList 提供安全的可并发的数据结构

  

 

小结 :

 

 

显示锁,提供了更好的灵活性,但不能完全替代synchronized,只有在synchronized无法买足需求时,

 

 

Read-write locks: 当访问以以读为主的数据结构时,可以调高程序的可伸缩性。 

 

 

 

分享到:
评论

相关推荐

    Java并发编程实战

    第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 ...第13章 显式锁 第14章 构建自定义的同步工具 第15章 原子变量与非阻塞同步机制 第16章 Java内存模型 附录A 并发性标注 参考文献

    Java并发编程实战2019.zip

    Java并发编程实战,第1章 简介,第2章 线程安全性 第3章 对象的共享 第4章 对象的组合 第5章 基础构建模块 第6章 任务执行 第7章 取消与关闭 第8章 线程池的使用 第9章 图形用户界面应用程序 第10章 避免...

    Java 并发编程实战

    前 言 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 ...第13章 显式锁 第14章 构建自定义的同步工具 第15章 原子变量与非阻塞同步机制 第16章 Java内存模型 附录A 并发性标注

    Java并发编程实践 PDF 高清版

    随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。...第13章 显示锁 第14章 构建自定义的同步工具 第15章 原子变量与非阻塞同步机制 第16章 Java存储模型 附录A 同步Annotation 参考文献 索引

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java 并发编程原理与实战视频

    java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    龙果java并发编程完整视频

    第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节synchronized保证线程安全的原理(理论层面)00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题与...

    java并发编程

    第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节sy nchronized保证线程安全的原理(理论层面)00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    网络nio 5.11读完了再通知我:aio 5.9并行算法:矩阵乘法 5.10准备好了再通知我:网络NIO 5.11读完了再通知我:AIO 5并行模式与算法 实战Java高并发程序设计(第2版)PPT模板全文共25页,当前为第13页。 6java8/9/10...

    scala编程中文pdf

    scala编程 33章 中文pdf ...第13 章Actors 和并发401 第14 章命令行任务440 第15 章Web 服务.475 第16 章数据库和持久化510 第17 章与Java 交互531 第18 章简单构建工具(SBT)551 第19 章类型589 第20 章惯用法.612

    Java程序设计(理论基础+实战案例)

    《Java程序设计》是面向计算机相关专业的一门专业基础课,涉及Java语言中面向对象编程、多线程处理、网络通信等内容,通过本课程的学习,学生能够了解 Java 语言特征、常见的 Java 类库以及面向...第十三章 项目案例

    蚂蚁java架构师(第七/八期含项目) |课件完整|完结无秘

    引领互联网最新技术潮流,手把手带您轻松月入2万+,三年逆袭Java互联网架构师的经验传授与您~ 〖课程目录〗: 01架构师必备技能之设计模式 02架构师必备安全技能 03从零开始学习多线程技术 04架构师必备技能并发编程...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    JAVA体系结构:Java培训项目,包括Java的各种核心知识

    第十三阶段学习指南 |-0.设计模式|-1.并发编程|-2.spring源码解读|-3.Mybatis专题|-4.JVM性能调优|-5....Java并发编程实质篇:并发基础+ JMM +线程池+一根量子+并发集合+并发工具类+锁+ atomic JVM与性能调优篇:

Global site tag (gtag.js) - Google Analytics