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的内置锁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并发实战 第13章 显式锁
- java并发编程实战-显式锁
- Java 并发编程实战学习笔记——路径查找类型并行任务的终止
- java 并发编程实战 第四天
- 【Java并发编程实战】—–“J.U.C”:锁,lock
- 【Java并发编程实战】-----“J.U.C”:Condition
- 【Java并发编程实战】—–“J.U.C”:ReentrantLock之二lock方法分析
- Java 并发编程实战学习笔记——CountDownLatch的使用
- 【java并发编程实战】-----线程基本概念
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
- 【Java并发编程实战】-----synchronized
- Java 7 并发编程实战手册目录
- Java 并发编程实战学习笔记
- 【Java并发编程实战】—–“J.U.C”:ReentrantLock之一简介
- Java 并发编程实战学习笔记——寻找可强化的并行性
- java 并发编程实战 第二天
- java并发编程实战手册第二章笔记
- java并发编程实战手册第二章2.8与死锁的演示
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之二lock方法分析