Synchroinzed 与lock 锁的区别

  1. 实现
    lock 是一个接口,而synchrized 是一个关键字。

  2. 释放锁

lock 锁需要手动释放锁,且出现异常的时候,不能释放锁,所以一般都需要try catch处理释放锁,避免死锁
synchronized 自动释放锁,

  1. 响应中断

locl 可以通过标志位响应中断

  1. 线程调度

synchroinzed 使用wait ,notify等待线程同步的方法, locl 使用condition 线程同步

//Condition定义了等待/通知两种类型的方法
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
...
condition.await();
...
condition.signal();
condition.signalAll();
  1. 性能比较

当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。

synchroized 在1.6之前使用的是重量级锁,那在1,6之后 进行了一系列的锁优化:有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上synchronize的性能并不比Lock差。官方也表示,他们也更支持synchronize,在未来的版本中还有优化余地。

  1. 使用场景

在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。

1.某个线程在等待一个锁的控制权的这段时间需要中断
2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程
3.具有公平锁功能,每个到来的线程都将排队等候

posted @ 2020-12-28 22:38  朝明  阅读(283)  评论(0编辑  收藏  举报