ReentrantLock 可重入锁总结

简介: 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时,必须手动获取和释放同步锁,避免出现死锁。

 

标签: 高并发

目录
相关文章
|
11月前
|
安全 Java
ReentrantLock、ReentrantReadWriteLock、StampedLock讲解
ReentrantLock、ReentrantReadWriteLock、StampedLock讲解
|
4月前
ReentrantLock
ReentrantLock
23 1
|
4月前
|
存储 设计模式 安全
理解 AQS 和 ReentrantLock
在多线程编程中,同步机制是确保线程安全的关键。AQS(AbstractQueuedSynchronizer)和ReentrantLock是Java中两种常见的同步机制,它们各自具有不同的特性和适用场景。了解和掌握这两种机制对于编写高效、安全的并发程序至关重要。这篇文章将带你取了解和掌握这两种机制!另外值得一提的是:公平锁的实现与非公平锁是很像的,只不过在获取锁时不会直接尝试使用CAS来获取锁。只有当队列没节点并且state为0时才会去获取锁,不然都会把当前线程放到队列中。
153 1
|
11月前
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
37 0
|
Java
16.ReentrantLock全解读
大家好,我是王有志。今天和大家一起聊聊ReentrantLock,它是我们最常见的基于AQS实现的互斥锁。
113 0
|
缓存 Java Linux
ReentrantLock、ReentrantReadWriteLock、StampedLock
ReentrantLock、ReentrantReadWriteLock、StampedLock
ReentrantLock、ReentrantReadWriteLock、StampedLock
|
Java 容器 安全
ReentrantLock详解
本博客主要讲述ReentrantLock的实现原理,主要内容包括: AQS原理以及实现过程。 ReenetrantLock获取锁、释放锁流程,以及原理。 ReenetrantLock源码分析。
6144 1
|
Java
彻底理解ReentrantLock可重入锁的使用
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。
187 0
彻底理解ReentrantLock可重入锁的使用
ReentrantLock介绍
ReentrantLock介绍
154 0
|
存储 设计模式 Java
深入理解ReentrantLock
同步锁synchronized和重入锁ReentrantLock都是用于并发程序设计必不可少的手段,在JDK 5.0早期版本中,同步锁性能远远低于重入锁,但是在6.0版本之后,jdk对同步锁做了大量的优化,使得同步锁跟重入锁性能差距并不大,并且jdk团队表示,同步锁还有进一步升级优化的空间
深入理解ReentrantLock