Lock锁

  • 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锁)