Lock锁

2021-07-16  本文已影响0人  凌晨的咸鱼
  1. Lock必须要主动释放,synchronized不需要

  2. Lock可以获取锁状态,synchronized不可以

  3. Lock读为共享锁,写为互斥锁。synchronized只要用了都是互斥

     简单实用:
     Lock lock = ...;
     if(lock.tryLock()) {
             try{
                 //处理任务
             }catch(Exception ex){
    
             }finally{
                 lock.unlock();   //释放锁
              } 
             }else {
                 //如果不能获取锁,则直接做其他事情
         }
     }
    
     Lock底层也是用CAS实现的
    

Synchronized和Lock并没有我们想象的有那么大差异,他们都是利用线程的阻塞(BLOCKING)来实现同步的,都是使用了基于锁的阻塞算法,只不过一个是内置锁(intrinsic lock),一个是显示锁。性能方便也没有什么差异,就未来来看,更可能提升性能的是Synchronized而不是ReentrantLock,因为Synchronized是JVM的内置属性,具备进一步优化的可能性。

虽然Synchronized和Lock在同步机制和性能上无差,但是在使用上还是有些差别的,具体比较内容如下:
Synchronized

Lock

最后再贴一段Doug Lea大神在书中,关于在Synchronized和ReentrantLock之间进行选择的原话,该如何选择,读者自己去思考吧。

在一些内置锁无法满足需求的情况下,ReentrantLock可以作为一种高级工具。当需要一些高级功能时才应该使用ReentrantLock,这些功能包括:可定时的,可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁。否则,还是应该优先使用Synchronized。

上一篇 下一篇

猜你喜欢

热点阅读