Java中提供了synchronized,为什么还要提供Lock呢?


Java 中提供了 synchronized 关键字和 Lock 接口两种机制来实现线程同步。虽然它们都用于控制多个线程对共享资源的访问,但它们有一些重要的区别和各自的优点。

1. synchronized 关键字

  • 隐式锁定synchronized 关键字是 Java 中最早引入的线程同步机制,它提供了一种简化的、隐式的锁定机制。当一个线程进入 synchronized 代码块或方法时,它会自动获取锁,并在退出时释放锁。
  • 可重入性:线程可以重复获取同一把锁,这称为可重入性。一个线程可以进入任何一个它已经拥有的锁所同步的代码块。
public synchronized void synchronizedMethod() {
    // 互斥操作
}

2. Lock 接口

  • 显式锁定Lock 接口提供了更灵活的、显式的锁定机制。通过 Lock 接口,你可以精确地控制锁的获取和释放。这提供了更多的灵活性和粒度,允许你在一段代码中获得锁,而在另一段代码中释放锁。
  • 可中断锁Lock 提供了可中断的锁,即线程可以在等待锁的过程中被中断。
  • 超时锁Lock 允许你设置等待锁的超时时间。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockExample {
    private Lock lock = new ReentrantLock();

    public void someMethod() {
        lock.lock();
        try {
            // 互斥操作
        } finally {
            lock.unlock();
        }
    }
}

选择使用 synchronized 还是 Lock

  • 在简单的场景中,synchronized 可能更加方便和简单。它的语法相对简单,而且由于其内置的可重入性,减少了某些类型的错误的可能性。
  • 在复杂的、需要更多控制的场景中,Lock 可以提供更大的灵活性和功能。例如,Lock 提供了条件变量、可中断的锁等功能。

总的来说,synchronized 是更简单、更自动的机制,适用于许多情况。而 Lock 提供了更多的功能和控制,适用于一些更复杂、特殊的应用场景。在选择时,可以根据具体的需求和场景进行权衡。


原文链接:codingdict.net