-
实现
lock 是一个接口,而synchrized 是一个关键字。 -
释放锁
lock 锁需要手动释放锁,且出现异常的时候,不能释放锁,所以一般都需要try catch处理释放锁,避免死锁
synchronized 自动释放锁,
- 响应中断
locl 可以通过标志位响应中断
- 线程调度
synchroinzed 使用wait ,notify等待线程同步的方法, locl 使用condition 线程同步
//Condition定义了等待/通知两种类型的方法
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
...
condition.await();
...
condition.signal();
condition.signalAll();
- 性能比较
当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。
synchroized 在1.6之前使用的是重量级锁,那在1,6之后 进行了一系列的锁优化:有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上synchronize的性能并不比Lock差。官方也表示,他们也更支持synchronize,在未来的版本中还有优化余地。
- 使用场景
在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。
1.某个线程在等待一个锁的控制权的这段时间需要中断
2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程
3.具有公平锁功能,每个到来的线程都将排队等候