Java中相对synchronized,SDK Lock的优势

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()来创建多个条件,如condition1condition2,线程调用condition1.await()condition2.await(),从而选择等待哪个条件;而synchronized修饰的方法或代码块只能通过lock.wait()(lock是一个Objcet)实现等待。

3.Lock可以实现公平锁和非公平锁,synchronized底层是非公平锁。

4.低并发时,由于synchronized具有分级锁的特性,性能跟Lock差不多。但高并发时,由于竞争激烈synchronized会升级为重量级锁,性能没有Lock稳定。

你可能感兴趣的:(Java中相对synchronized,SDK Lock的优势)