美文网首页
除了synchronized,还可以试一试Lock,它们又有什么

除了synchronized,还可以试一试Lock,它们又有什么

作者: 程就人生 | 来源:发表于2022-07-09 10:05 被阅读0次

    synchronized和Lock都是Java中解决线程安全问题的一个工具,下面通过几个方面来看看它们有什么不同。

    一、synchronized
    synchronized是Java中的内置关键字,作用在需要同步的方法上,代码块上;

    /**
       * synchronized作用在方法上
       */
      public synchronized void sync(){
        // TODO
      }
      
      private Object obj;
      
      /**
       * synchronized作用在代码块上
       */
      public void sync1(){
        synchronized(obj){
          // TODO
        }
      }
    

    synchronized在代码块/方法执行结束或执行异常时才释放锁,因此对锁的释放是被动的,采用的是悲观锁机制,托管给JVM执行。

    二、Lock
    Lock是java.util.concurrent 包下的接口,它有多种实现类,ReentrantLock便是其中的一个实现类。

    Lock lock = new ReentrantLock(); 
      
      /**
       * Lock使用
       */
      public void sync2(){ 
        //添加锁 
        lock.lock(); 
        
        //TODO线程安全的代码 
        
        //释放锁 
        lock.unlock(); 
        
        // 提供非阻塞竞争锁的方法,确定当前线程是否使用锁
        // lock.tryLock();
        
      }
    

    Lock的作用域取决于Lock实例的生命周期,通过lock()和unlock()方法,可以保证lock()和unlock()之间的代码是线程安全的。

    Lock相对synchronized更灵活一点,它可以决定什么时候加锁,什么时候释放锁,为了避免死锁,一般将unlock放在finally代码块中。还可以使用trylock方法确定当前线程是否使用锁。lock采用的是乐观的锁,控制锁的代码自定义,也采用CAS自旋锁进行了优化。

    三、synchronized与Lock的锁机制
    synchronized只提供了非公平锁的实现,而Lock提供了非公平锁和公平锁的机制。
    公平锁机制,线程竞争锁资源的时候,如果已经有其他线程正在排队或等待释放锁,那么其他锁是无法插队的。
    非公平锁机制,不管有没有其他线程正在排队或等待释放锁,它都会尝试去竞争一次锁。

    相关文章

      网友评论

          本文标题:除了synchronized,还可以试一试Lock,它们又有什么

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