ReenTrantLock和synchronized有什么区别

ReenTrantLock和synchronized有什么区别

1.使用区别
 Lock是一个接口,而synchronized是关键字,是内置的语言实现。
 Synchronized发生异常时,会自动释放线程占用的锁,故不会发生死锁现象。Lock发生异常时,若没有主动释放,极有可能造成死锁,故需要在finally中调用unlock()方法释放锁。
 通过Lock可以知道有没有成功获得锁,而synchronized就不可以了.
 Lock有着显式的操作过程,开发人员必须手动指定何时加锁,何时释放锁,因而重入锁对逻辑控制的灵活性优于synchronized。

2.功能区别
 重入锁可以提供几个高级功能:
 (1)可中断锁:体现在lockInterruptibly()方法。如果线程A正在执行锁中代码,线程B正在等待获取该锁,时间太长了,B收到通知不用等了,它就可以中断自己,停止工作了。
 (2)锁申请等待限时:体现在tryLock()方法上。
 (3)公平锁:ReentrantLock可以实现公平锁,构造函数有一 public ReentrantLock(boolean fair),为true时使用公平锁。
 (4)读写锁:读写锁将对一个资源的访问分为两个锁,一个读锁,一个写锁,从而使得读读不互斥,读写互斥以及写写互斥,提高性能。ReadWriteLock就是读写锁,是一个接口,ReentrantReadWriteLock实现了这个接口。可以通过readLock()获取读锁,writeLock()获取写锁。
 (5)绑定多个条件:一个ReentrantLock可以绑定多个Condition对象,仅需多次调用new Condition()即可。而在synchronized中锁对象的wait()、notify()/notifyAll()可以实现一个隐含的条件,如果要和多余的条件关联,就不得不使用多个锁。

3.性能比较
 JDK5中,重入锁的性能是远优于synchronized的。因为这是一个重量级操作,对性能的最大的影响是阻塞的实现,挂起线程和恢复线程的操作,都需要转入内核态中完成,给并发带来很大的压力。
 但从JDK6开始,synchronized中加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化之后,两者的性能差距不大了。

你可能感兴趣的:(Java高并发,java,synchronized)