Java中Synchronized和Lock的区别

在《Java程序员面试宝典》是这么回答的
问:请对比synchronized与java.util.concurrent.locks.Lock的异同。
答:主要相同点: Lock能完成synchronized所实现的所有功能。
       主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。


可以详细引申一下:
1、lock是一个接口,而synchronized是java的一个关键字;
2、Lock的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的;(synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。)
3、synchronized在发生异常时候JVM会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生(所以将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
4、lock等待锁过程中可以用interrupt来终端等待,而synchronized只能等待锁的释放,不能响应中断;
5、lock可以通过trylock来知道有没有获取锁,而synchronized不能;
6、Lock可以提高多个线程进行读操作的效率;(可以通过readwritelock实现读写分离)
7、在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。当需要以下高级特性时,才应该使用Lock:可定时的、可轮询的与可中断的锁获取操作,公平队列,或者非块结构的锁。否则,请使用synchronized。  


你可能感兴趣的:(java基础)