synchronized 和 Lock 的区别?

1、synchronized 是 Java 的一个关键词;而 Lock 是一个接口。

所以 synchronized 是在 JVM 层面上实现的,synchronized 在锁定时如果方法快抛出异常, JVM 就会自动将锁释放掉,不会因为出了异常而没有释放锁而造成死锁;

而 Lock 是使用代码实现的,系统不会自动释放锁,必须在 finally 语句中显式地释放锁 lock.unlock,所以使用 Lock 最好用 try-catch 语句来捕捉异常,然后手动释放锁,不然会造成死锁。

2、synchronized 是使用 Object 对象本身的 wait(),notify(),notifyAll() 来进行线程之间的调度;而 Lock 可以使用 condition 来进行线程之间的调度。

3、在获取锁的时候,Lock 可以调用 tryLock() 方法来尝试获取锁,也可以调用 lockInterruptibly() 方法来响应中断正在等待中的线程,这样即使线程没有获取到锁也不用一直等待;

而 synchronized 在获取锁的时候是只能有一个线程获取到锁,而另外的线程会一直等待,这样很浪费资源。

4、应用场景:(少量同步和大量同步)

资源竞争不是很激烈的情况下,synchronized 的性能要优于ReetrantLock 的,所以一般来说是使用 synchronized 来进行同步;

而在资源竞争很激烈的情况下,synchronized 的性能会下降几十倍,但是 ReetrantLock 的性能能维持常态,这时候就可以使用 Lock。例如:Lock 可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/85863925