1 结论
| lock | synchronized |
---|
语法 | 接口(java 实现) | 关键字,源码在 jvm中(C++实现) |
释放锁 | 手动 | 自动 |
功能 | 悲观锁,互斥、同步、锁重入 | 悲观锁,互斥、同步、锁重入 |
特性 | | 获取等待状态、公平锁、可打断、可超时、多条件变量 |
性能 | 没有竞争时,性能较好 | 竞争激烈时,性能较好 |
2 lock
1)非公平锁
- 公平锁的公平体现
- 已经处在阻塞队列中的线程(不考虑超时)始终都是公平的,先进先出
- 公平锁是指未处于阻塞队列中的线程来争抢锁,如果队列不为空,则老实到队尾等待
- 非公平锁是指未处于阻塞队列中的线程来争抢锁,与队列头唤醒的线程去竞争,谁抢到算谁的
- 公平锁会降低吞吐量,一般不用
static final ReentrantLockLOCK = new ReentrantLock(true);
2)条件变量
- ReentrantLock 中的条件变量功能类似于普通 synchronized 的 wait,notify,用在当线程获得锁后,发现条件不满足时,临时等待的链表结构
- 与 synchronized 的等待集合不同之处在于,ReentrantLock 中的条件变量可以有多个,可以实现更精细的等待、唤醒控制
static Condition c1 = LOCK.newCondition("c1");
c1.await();