ReetrantLock vs synchronized
线程安全需要保证几个基本特征
- 原子性,相关操作不会中途被其他线程干扰,一般通过同步机制实现
- 可见性,一个线程修改了某个共享变量,其状态能立即被其他线程知晓
- 有序性,是保证线程内串行语义,避免指定重拍
synchronized使用 monitorenter/monitorexit
ReetrantLock
- 支持公平性,会品倾向于把锁赋给等待时间最久的线程,synchronized是不公平的
- 一般情况下公平性没有那么重要,Java默认调度策略很少会导致饥饿,除非确实有公平性需要才要指定
- 带超时的获取锁尝试
- 可以判断是否有线程,或者某个特定线程,在排队等待获取锁
- 可以响应中断请求
- ReentrantLock还包括了条件变量(java.util.concurrent.Condition)
- 不要将获取锁的过程写在try块内,因为如果在获取锁时发生了异常,异常抛出的同时,也会导致锁无故被释放