ReentrantLock 可重入锁总结

本文为博主原创,未经允许不得转载:

ReentrantLock 是一种内置锁,也叫可重入锁(ReentrantLock),它允许线程再次获取已持有的同步锁,这样防止死锁的发生。在使用ReentrantLock时,需要手动获取和释放同步锁,即使出现异常,也一定要保证每次获取和释放同步锁的次数一致。

ReentrantLock 的主要特点如下:

  1. 可重入性:同一线程可以进入获取同步锁,也可以再次获取持有的同步锁。

  2. 可中断性:在等待获取同步锁的线程可以响应中断,也就是当线程处于等待获取同步锁的状态时,可以中断等待,它不会永久长时间等待下去。

  3. 公平锁:锁获取是公平的,多个线程通过 ReentrantLock 获取锁时,会先进入同步队列中,按照顺序获取同步锁,减少了线程间的竞争。

使用ReentrantLock的步骤:

  1. 创建ReentrantLock对象,通过构造方法可以选择公平锁或非公平锁;

  2. 在需要同步的代码块中,在使用ReenrantLock的lock()方法获取同步锁,在同步代码块执行完之后必须手动释放同步锁,否则会出现死锁的现象;

  3. 对于可能抛出异常的同步代码块,在finally中一定要释放同步锁。

示例代码:

ReentrantLock lock = new ReentrantLock();  // 创建ReentrantLock对象
try {
    lock.lock();  // 获取同步锁
    // 同步代码块
} finally {
    lock.unlock();  // 释放同步锁
}

 

可重入锁的示例说明

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {

    private static final ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
        new Thread(() -> {
            lock.lock(); // 获取同步锁
            try {
                System.out.println(Thread.currentThread().getName() + " 获取锁");
                doSomething(); // 调用可重入方法
            } finally {
                lock.unlock(); // 释放同步锁
            }
        }, "Thread-1").start();

        new Thread(() -> {
            lock.lock(); // 获取同步锁
            try {
                System.out.println(Thread.currentThread().getName() + " 获取锁");
                doSomething(); // 调用可重入方法
            } finally {
                lock.unlock(); // 释放同步锁
            }
        }, "Thread-2").start();
    }

    public static void doSomething() {
        lock.lock(); // 再次获取同步锁
        try {
            System.out.println(Thread.currentThread().getName() + " 再次获取锁,并执行业务逻辑");
        } finally {
            lock.unlock(); // 释放同步锁
        }
    }
}

  在该示例中,创建了一个静态的ReentrantLock对象。两个线程分别获取同步锁,调用了一个可重入方法doSomething(),该方法中又再次获取了同步锁,这样就实现了可重入性。注意,在使用ReentrantLock时,必须手动获取和释放同步锁,避免出现死锁。

 

posted @ 2022-01-08 23:01  香吧香  阅读(46)  评论(0编辑  收藏  举报