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: 当访问以以读为主的数据结构时,可以调高程序的可伸缩性。
相关推荐
前 言 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 ...第13章 显式锁 第14章 构建自定义的同步工具 第15章 原子变量与非阻塞同步机制 第16章 Java内存模型 附录A 并发性标注
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...
随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。...第13章 显示锁 第14章 构建自定义的同步工具 第15章 原子变量与非阻塞同步机制 第16章 Java存储模型 附录A 同步Annotation 参考文献 索引
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...
java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...
第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节synchronized保证线程安全的原理(理论层面)00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题与...
第13节从Java字节码的角度看线程安全性问题00:25:43分钟 | 第14节sy nchronized保证线程安全的原理(理论层面)00:13:59分钟 | 第15节synchronized保证线程安全的原理(jvm层面)00:25:03分钟 | 第16节单例问题...
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应用领域。以下是各章节的主要知识点概述: 1. **第7章 - 单机连连看** ...
在“第十课 Java 网络编程”中,你将学习如何创建简单的聊天服务器、文件传输应用,以及如何处理HTTP请求,这些都是Java网络编程的实战案例,有助于加深理解和应用。 总之,Java网络编程是开发分布式系统、Web服务...
第十讲:JAVA高级特性与实战 涵盖JAVA的高级特性,如枚举、泛型、Lambda表达式等,并结合实际案例进行编程练习,提高解决问题的能力。 课程还包含了丰富的课后习题,旨在巩固所学知识,通过实战练习提升编程技能。...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的基础概念、协议以及如何在Java平台上实现这些功能。分布式计算则是利用多台计算机协同工作来处理大量数据或执行复杂任务的技术,它极大地提升了系统的可扩展...
第十三章至第十五章可能会涵盖输入/输出(I/O)流、多线程编程以及网络编程。读者将学习如何在Java中读写文件,创建并发程序,以及实现基于TCP/IP的网络通信,为构建分布式系统打下基础。 通过这本书的学习,读者...
8. **线程与并发**:在多核处理器环境下,第17章会介绍如何在Java中创建和管理线程,以及并发编程的基本概念和工具,如synchronized关键字和ExecutorService。 9. **反射与注解**:第18章可能会涉及Java的反射机制...
4. **第13章** - 集合框架 Java集合框架是处理数据的重要工具,包括List、Set、Map等接口及其实现类。通过实战源码,我们可以学习如何高效地存储和操作数据,理解各种集合类的特性和适用场景。 5. **第15章** - 多...
5. **并发编程优化**:理解Java并发库,如线程池(ThreadPoolExecutor)、Future、Callable、Lock接口,以及如何避免死锁、活锁和饥饿。 6. **CPU和磁盘I/O优化**:降低系统调用,减少磁盘I/O操作,使用NIO(非阻塞...