📜  ReentrantLock java(1)

📅  最后修改于: 2023-12-03 15:04:52.864000             🧑  作者: Mango

ReentrantLock Java

ReentrantLock 是 Java 提供的一种可重入锁,与 synchronized 关键字类似,但具有更多的扩展性和灵活性。使用 ReentrantLock 可以更加精确地实现锁的控制,确保线程的安全。

特性

以下是 ReentrantLock 的几个特性:

  • 可重入性:与 synchronized 相同,ReentrantLock 也支持重入,同一个线程可以重复获取同一把锁。
  • 公平锁和非公平锁:ReentrantLock 可以被设置为公平锁或非公平锁。公平锁保证获取锁的顺序按照线程的到达时间有序进行,而非公平锁则没有这个保证,可能会导致某些线程长时间无法获得锁。
  • 锁绑定多个条件:ReentrantLock 可以绑定多个条件,这些条件可以在不同的线程之间协调通信。
  • 中断响应:当线程在等待锁的时候,可以随时中断等待,这时可以抛出中断异常,通过这种方式可以更加精细地控制锁的行为。
使用方法

以下是一个使用 ReentrantLock 的例子:

import java.util.concurrent.locks.ReentrantLock;

public class MutexDemo implements Runnable {
    private ReentrantLock lock = new ReentrantLock();

    public void run() {
        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "获得了锁");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
            System.out.println(Thread.currentThread().getName() + "释放了锁");
        }
    }

    public static void main(String[] args) {
        MutexDemo demo = new MutexDemo();

        Thread thread1 = new Thread(demo, "Thread-1");
        Thread thread2 = new Thread(demo, "Thread-2");

        thread1.start();
        thread2.start();
    }
}

在这个例子中,创建了一个 ReentrantLock 实例 lock,并使用它保护了一个代码块。在 run 方法中,用 lock.lock() 获取锁,在 finally 块中调用了 lock.unlock() 释放锁。这里使用 try finally 构造是为了确保无论代码是否正常执行,都会及时地释放锁。

总结

ReentrantLock 相对于 synchronized 更加灵活,支持重入、公平锁和非公平锁、多条件等特性。但是,在使用 ReentrantLock 时需要格外小心,避免产生死锁等问题。