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)机制。

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

示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值