synchronized和lock有什么区别,用lock有什么好处

1. 层面    synchronized属于jvm层面,是java的关键字,是内置特性;而Lock属于api层面,是java5后产生的一个接口


2. 释放锁    synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。


3. 用法 不一样。synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象。而Lock需要显示地指定起始位置和终止位置。synchronzied是托管给jvm执行的,Lock锁定是通过代码实现的。 


4. 性能  上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。 


5. 异常   synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;


6. 中断  Lock可以让等待锁的线程响应中断(tryLock(Long timeout,TimeUnit unit)),而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。Lock可以提高多个线程进行读操作的效率。


7. 底层实现   synchronized底层用monitor对象完成 (monitorenter、monitorexit)


8. 锁公平  synchronized是非公平锁;ReentrantLock可以是公平锁,也可以是非公平锁,默认是非公平锁,通过构造方法传入boolean值来确定。


9. Condition   synchronized没有;ReentrantLock用以实现分组唤醒需要唤醒的线程,可以精确唤醒,而不像synchronized要么随机唤醒一个,要么全部唤醒。

发布了24 篇原创文章 · 获赞 2 · 访问量 416

猜你喜欢

转载自blog.csdn.net/qq_42107430/article/details/103865053