Lock锁

作者: 凌晨的咸鱼 | 来源:发表于2021-07-16 17:55 被阅读0次
    • Lock和synchronized都是可重入锁,线程进程synchronized的A方法可以在此进入synchronized的B方法。
      Lock和synchronized默认都是非公平锁,等待线程随机进入。但是Lock锁可以设置为公平锁
      Lock是可中断锁,可以中断之后去做其他事情。synchronized为不可中断锁

    • lock.lock()方法尝试获取锁,获取不到一直等待。
      lock.tryLock()获取到返回true,获取不到返回false。
      lock.tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似的,只不过区别在于这个 方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false,同时可以响应中断。如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。
      这些都表明,lock锁有更多的 灵活性的用法

    • Lock锁和synchronized区别:

    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

    • 优点:实现简单,语义清晰,便于JVM堆栈跟踪;加锁解锁过程由JVM自动控制,提供了多种优化方案。
    • 缺点:不能进行高级功能(定时,轮询和可中断等)。

    Lock

    • 优点:可定时的、可轮询的与可中断的锁获取操作,提供了读写锁、公平锁和非公平锁
    • 缺点:需手动释放锁unlock,不适合JVM进行堆栈跟踪。

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

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

    相关文章

      网友评论

          本文标题:Lock锁

          本文链接:https://www.haomeiwen.com/subject/cmmbpltx.html