首页 > 其他分享 >ReentrantLock

ReentrantLock

时间:2024-12-28 16:31:17浏览次数:8  
标签:ReentrantLock lock 房间 finally unlock 钥匙 进入

想象一下,你和你的朋友们想要进入一间房间,这间房间一次只能有一个人在里面。为了控制谁能进入这个房间,我们使用了一把锁。在这个比喻中,锁就是 ReentrantLock

情景1:基本的锁

假设你拿到了钥匙(调用 lock.lock()),进入了房间。现在,如果另一个朋友也想进入房间,他们就必须等待你先出来并把钥匙放回(调用 lock.unlock())。一旦你出来并且释放了锁,下一个朋友就可以拿到钥匙进入房间。


Lock lock = new ReentrantLock();

public void enterRoom() {
    lock.lock(); // 尝试获取钥匙进入房间
    try {
        // 在房间里做一些事情... 嘿嘿嘿...
    } finally {
        lock.unlock(); // 离开房间并把钥匙放回去
    }
}

情景2:可重入性

现在,假设你是那个已经在房间里的人,并且你需要做更多的事情,比如检查房间里的每个角落。因为你是持有钥匙的人,所以你可以多次开门(再次调用 lock.lock())而不会被阻挡在外面。每当你完成一部分工作后,你就把钥匙插回锁里一次(调用 unlock())。只有当所有的 lock()unlock() 成对出现时,其他人才有机会进入房间。


public void checkEveryCorner() {
    lock.lock();
    try {
        // 检查第一个角落
        
        lock.lock();
        try {
            // 检查第二个角落
        } finally {
            lock.unlock();
        }
        
        // 继续检查剩下的角落...
    } finally {
        lock.unlock();
    }
}

情景3:公平性

想象一下,如果有好几个人都想进入这个房间,他们都在外面排队等着。如果你使用的是公平锁,那么他们会按照到达顺序依次进入。但是,如果你使用的是非公平锁,有时候后来的人可能会在队伍前面的人之前得到机会进入房间,因为他们碰巧在锁可用的时候尝试了。

// 创建一个公平锁
Lock fairLock = new ReentrantLock(true);

情景4:尝试获取锁

有时候,你可能不想一直等下去,而是想看看是否能立刻进入房间。如果你不能立刻进入,你也许会去做些别的事,稍后再回来试试。这就是 tryLock() 的作用——它尝试获取锁,但如果锁不可用,它会立即返回而不是等待。


if (lock.tryLock()) {
    try {
        // 进入房间并做事
    } finally {
        lock.unlock();
    }
} else {
    // 锁不可用,做些别的事
}

标签:ReentrantLock,lock,房间,finally,unlock,钥匙,进入
From: https://blog.csdn.net/hmbbpdx/article/details/144790932

相关文章

  • 详解AQS四:ReentrantLock条件队列原理
    ReentrantLock的条件队列是实现“等待通知”机制的关键,之前在《java线程间通信:等待通知机制》一文中讲过了使用ReentrantLock实现多生产者、多消费者的案例,这个案例实际上在java源码的注释中已经给了,可以看Condition接口上的注释中相关的代码:classBoundedBuffer{finalLoc......
  • 详解AQS二:ReentrantLock公平锁原理
    ReentrantLock作为我们使用频率最高的显式锁,它是AQS的经典实现,本篇文章将以ReentrantLock公平锁为例讲解AQS的实现。一、ReentrantLock在之前的文章《线程同步机制一:内部锁和显式锁》中已经提到过关于显式锁ReentrantLock的简单使用privatefinalLocklock=newReentrantLock(......
  • Java代码示例:使用ReentrantLock与Condition来确保两个线程可以交替打印字符和数字(两个
    在Java中,你可以使用wait()和notifyAll()方法或者更现代的同步工具如java.util.concurrent包中的Semaphore、CountDownLatch或CyclicBarrier等来实现线程间的通信。对于这个问题,我们可以使用ReentrantLock与Condition来确保两个线程可以交替打印字符和数字。下面是一个简单......
  • ReentrantLock详细讲解,什么是ReentrantLock锁,什么是Condition条件变量(二)
    文章目录一、ReentrantLock中的Condition案例:生产者消费者模式二、await和unlock都释放锁?先看上一篇文章:ReentrantLock基本使用,再来学习本篇。一、ReentrantLock中的Condition1、Condition表示条件对象,主要用于线程间通信,通常与锁结合使用,可以让一......
  • AtomicBoolean与ReentrantLock
    AtomicBoolean主要用来解决并发编程中的线程安全问题,防止某段代码重复执行或确保某项任务只能执行一次。代码中常用来作为一个标志变量,以控制并发流程。AtomicBoolean体现的是一种无锁机制,依靠底层的高效的CAS原子操作实现,提供高效的线程安全操作。CAS简介CAS的核心思想是'比较......
  • Java同步机制深度解析: synchronized vs ReentrantLock
    目录1.引言2.synchronized关键字2.1基本用法2.2实现原理2.2.1Java对象头2.2.2Monitor对象2.3锁升级过程2.4锁消除和锁粗化2.5自旋锁与自适应自旋锁2.6synchronized的特性3.ReentrantLock3.1基本用法3.2实现原理3.2.1AQS的核心思想3.2.2ReentrantLock的......
  • 并发编程中锁Synchronized和ReentrantLock,CAS,AQS理解
    SynchronizedJAVA关键字,独占式的悲观锁,可重入锁。主要解决多个线程之间的访问资源的同步性,可以保证被他修饰的方法或者代码块在任意时刻只能有一个线程执行早期是重量级锁,JAVA6后引入大量优化,自旋锁,适应性自旋锁,偏向锁,轻量级锁,锁消除,锁粗化减少锁的开销使用方式修饰......
  • Synchronized锁和Reentrantlock的区别和联系以及锁升级
    二者的底层实现:Synchronized就是基于monitor对象主要的为Owner获得这个锁资源的线程唯一标识符(线程ID)Count线程获得几次锁(可重入锁的实现)ContentionList等待队列(线程加锁失败的情况下)Reentrantlock是基于AQS这个就是表示是哪一个线程获得这个锁资源    ......
  • ReentrantLock 实现原理
    文章目录ReentrantLock基本使用可重入锁等待可中断设置超时时间公平锁条件变量ReentrantLock原理加锁流程解锁流程可重入锁原理可打断原理公平锁原理条件变量原理ReentrantLock基本使用在Java中,synchronized和ReentrantLock都是用于确保线程同步的锁,都属于......
  • Java 中的 volatile和synchronized和 ReentrantLock区别讲解和案例示范
    在Java的并发编程中,volatile、synchronized和ReentrantLock是三种常用的同步机制。每种机制都有其独特的特性、优缺点和适用场景。理解它们之间的区别以及在何种情况下使用哪种机制,对提高程序的性能和可靠性至关重要。本文将详细探讨这三种机制的特性、使用场景及示例......