跳到主要内容

简述synchronized和java.util.concurrent.locks.Lock的异同 ?

参考答案:

synchronizedjava.util.concurrent.locks.Lock都是Java中用于控制多个线程对共享资源的访问的工具,以防止出现线程安全问题。它们都是可重入锁,即一个线程可以多次获得同一个锁。

相同点:

  1. 互斥性:两者都保证了在同一时刻只有一个线程可以执行被保护的代码块。
  2. 可重入性:无论是synchronized还是Lock,都允许同一个线程多次获取锁。
  3. 中断性:两者都支持线程中断,当一个线程在等待锁的过程中被中断,它会收到InterruptedException

不同点:

  1. 等待可中断性synchronized的等待/通知机制(wait/notify/notifyAll)是不可中断的,而Lock接口中提供了可以中断的等待/通知机制(Condition接口的await()signal()方法)。
  2. 锁的释放synchronized在发生异常时,会自动释放锁。而Lock则需要显式调用unlock()方法来释放锁,否则可能导致死锁。
  3. 锁的公平性synchronized锁是非公平的,无法保证等待的线程按照它们等待的顺序获得锁。而Lock接口中的ReentrantLock类可以通过构造函数的参数来选择是否公平。
  4. 锁的获取synchronized是自动获取和释放锁的,而Lock需要手动获取和释放锁,这提供了更大的灵活性。
  5. 尝试获取锁Lock接口提供了tryLock()方法,这个方法会尝试获取锁,如果锁被其他线程占用,它会立即返回,不会阻塞当前线程。而synchronized没有提供这样的机制。

总的来说,synchronized是Java语言内置的锁机制,使用起来更简单,但是功能相对较少。而Lock接口提供了更多的灵活性和功能,适合更复杂的并发控制需求。