锁
不同锁的定义
独占锁与共享锁
- 独占锁:同一时间,一把锁只能被一个线程获取;
- 共享锁:同一时间,一把锁可以被多个线程获取。
公平锁与非公平锁
- 公平锁:线程获取锁的顺序,严格按照它们请求锁的时间顺序(FIFO)来分配。先请求的线程优先获得锁,后请求的必须排队。这种锁往往性能稍差,因为要保证申请时间上的顺序性;
- 非公平锁: 锁被释放后,后续线程获得锁的可能性随机,或者按照设置的优先级进行抢占式获取锁。
| 特性 | 公平锁 ReentrantLock(true) | 非公平锁 synchronized / ReentrantLock(false) |
|---|---|---|
| 锁分配顺序 | 按请求时间 FIFO | 允许抢占,吞吐量通常更高 |
| 线程饥饿 | 很少发生 | 可能发生(某些线程长期得不到锁) |
| 性能 | 稍差(因为需要维护有序队列) | 更好 |
可重入锁
所谓可重入锁就是一个线程在获取到了一个对象锁后,线程内部再次获取该锁,依旧可以获得,即便持有的锁还没释放,仍然可以获得,不可重入锁这种情况下会发生死锁! 可重入锁在使用时需要注意的是:由于锁会被获取 n 次,那么只有锁在被释放同样的 n 次之后,该锁才算是完全释放成功。
可中断锁与不可中断锁
- 可中断锁:在获取锁的过程中可以中断获取,不需要非得等到获取锁后再去执行其他逻辑;
- 不可中断锁:一旦线程申请了锁,就必须等待获取锁后方能执行其他的逻辑处理。
ReentrantLock
ReentrantLock是一种同时拥有独占式、可重入、可中断、公平/非公平特性的同步器!