1.synchronized的问题在于,一旦获取锁不成功,线程会进入阻塞状态,如果发生死锁,线程就没有被唤醒的机会了。SDK的Lock提供了3个方法可以防止线程永远的等待下去:
// 支持中断的 API
void lockInterruptibly()
throws InterruptedException;
// 支持超时的 API
boolean tryLock(long time, TimeUnit unit)
throws InterruptedException;
// 支持非阻塞获取锁的 API
boolean tryLock();
所以调用以上方法获取锁失败,可以返回,并释放资源,防止死锁。
2.Lock可以通过newCondition()
来创建多个条件,如condition1
和condition2
,线程调用condition1.await()
和condition2.await()
,从而选择等待哪个条件;而synchronized修饰的方法或代码块只能通过lock.wait()
(lock是一个Objcet)实现等待。
3.Lock可以实现公平锁和非公平锁,synchronized底层是非公平锁。
4.低并发时,由于synchronized具有分级锁的特性,性能跟Lock差不多。但高并发时,由于竞争激烈synchronized会升级为重量级锁,性能没有Lock稳定。