ReentrantLock
ReentrantLock 是 Lock 的默认实现
使用注意
- lock()方法和 unlock()方法需要成对出现,锁了几次,也要释放几次,否则后面的线程无法获取锁 了;可以将 add 中的 unlock 删除一个事实,上面代码运行将无法结束
- unlock()方法放在 finally 中执行,保证不管程序是否有异常,锁必定会释放
- ReentrankLock 中必须使用实例方法 lockInterruptibly() 获取锁时,在线程调用 interrupt() 方法之后,才会引发 InterruptedException 异常
- 线程调用 interrupt()之后,线程的中断标志会被置为 true
- 触发 InterruptedException 异常之后,线程的中断标志有会被清空,即置为 false 4. 所以当线程调用 interrupt()引发 InterruptedException 异常,中断标志的变化是:false->true- >false
ReentrantLock 和 Synchronized 对比
- 可重入锁:可重入锁是指同一个线程可以多次获得同一把锁;ReentrantLock 和关键字 Synchronized 都是可重入锁
- 可中断锁:可中断锁时只线程在获取锁的过程中,是否可以相应线程中断操作。synchronized 是 不可中断的,ReentrantLock 是可中断的
- 公平锁和非公平锁:公平锁是指多个线程尝试获取同一把锁的时候,获取锁的顺序按照线程到达的 先后顺序获取,而不是随机插队的方式获取。synchronized 是非公平锁,而 ReentrantLock 是两种 都可以实现,不过默认是非公平锁
Simple is Awesome