美文网首页
除了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