`
zhouchaofei2010
  • 浏览: 1104605 次
  • 性别: 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 并发性标注

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

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

    龙果 java并发编程原理实战

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

    Java并发编程实践 PDF 高清版

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

    Java并发编程的艺术

    第三章专门讨论Java内存模型,这是一个对Java并发编程至关重要的主题。Java内存模型定义了程序的不同部分如何共享数据,特别是在多线程环境中。本章详细介绍了内存可见性、原子性和有序性等概念,并探讨了它们如何...

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

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

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...

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

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

    龙果java并发编程完整视频

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

    Java Web编程宝典-十年典藏版 完整版 pdf

    《Java Web编程宝典-十年典藏版》是Java Web领域的经典著作,全面涵盖了从基础到高级的各类技术,旨在帮助读者深入理解并熟练掌握Java Web开发。这本书完整版的PDF版本提供了丰富的学习资料,适合初学者和有一定...

    Java编程宝典-十年典藏版

    3. Java核心技术:这本宝典应该深入讲解了Java的核心技术,如JVM(Java虚拟机)、Java类库、Java集合框架、Java IO流、多线程与并发编程、网络编程、反射机制、泛型编程等。 4. 高级特性:书中可能还包括Java的高级...

    java并发编程

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

    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

Global site tag (gtag.js) - Google Analytics