您的位置:首页 > 编程语言 > Java开发

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

2017-04-27 19:17 337 查看
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)机制。

什么情况下使用读写锁?

一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。

示例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 并发 线程