Java并发编程实战 - 第13章 显式锁

synchronized和ReentrantLock
Java的内置锁synchronized和ReentrantLock有相同的内存语义。但内置锁在功能上有不足,如不能中断一个正在等待获得锁的线程,或者无法请求获得一个锁时无限等待下去。
相对于内置锁 - 显式锁 ReentrantLock更加灵活,提供了可轮询的,定时的,可中断的的锁操作,非块结构的加锁以及公平锁/非公平锁的选择。

ReentrantLock实现Lock接口,使用时必须要在finally块中释放。

轮询锁与定时锁
ReentrantLock通过tryLock方法提供可轮询的与定时的锁,可避免死锁。
内置锁通常通过一致的锁顺序避免死锁。

可中断的锁获取操作
ReentrantLock 的lockInterruptibly方法获取锁并能响应中断。
定时的tryLock方法也可以获取锁并响应中断。

非块结构的加锁

synchronized和ReentrantLock的性能比较
ReentrantLock性能在Java 5胜出很多,在Java 6略胜出。

公平性
默认的ReentrantLock 和 内置锁一样不会提供公平性保证。
ReentrantLock有一个带boolean类型参数的构造器,它允许您创建一个公平(fair)锁,或不公平(unfair)锁。公平锁使线程按照请求锁的顺序依次获得锁;而不公平锁则允许讨价还价,在这种情况下,线程有时可以比先请求锁的其他线程先得到锁。

在大多数情况下,非公平锁的性能高于公平锁。
当持有锁的时间比较长,或请求锁的平均时间间隔较长,那么应该使用公平锁。

如何选择synchronized和ReentrantLock
优先选择内置锁,内置锁不能满足时用ReentrantLock.

读写锁
synchronized和ReentrantLock是标准的互斥锁,每次最多只有一个线程能持有锁。互斥是一种保守的加锁策略,它避免了写-写读-写冲突,但也避免了读-读冲突,造成不必要的并发。

大多数的访问操作可能是读操作,应该允许多个线程同时访问来提高程序的性能。Java提供了读写锁(ReadWriteLock)机制。

什么情况下使用读写锁?
一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。

示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章