首页 > 其他分享 >AtomicBoolean与ReentrantLock

AtomicBoolean与ReentrantLock

时间:2024-12-03 11:25:09浏览次数:3  
标签:false CAS ReentrantLock boolean 线程 AtomicBoolean

AtomicBoolean

主要用来解决并发编程中的线程安全问题,防止某段代码重复执行或确保某项任务只能执行一次。代码中常用来作为一个标志变量,以控制并发流程。AtomicBoolean体现的是一种无锁机制,依靠底层的高效的CAS原子操作实现,提供高效的线程安全操作。

CAS简介

CAS的核心思想是'比较和交换'

如果内存中的值与预期值相等,则将其更新为新值,否则什么都不操作。

三个操作数:内存值(V,被操作的变量存在内存中)预期值(E,操作前线程认为的值应该是此值)更新值(U,如果内存值与预期值相等则更新为此值)

比较V&E--> 如果V== E 把V的值更新为U,并返回true;--> 如果V!=E 则不更新V值,并返回false

底层是依赖CPU的硬件指令来实现。体现的是一种无锁机制,不需要通过显式的加锁解锁来控制线程的执行,避免了线程上下文切换带来的开销。

CAS的一些缺点 如ABA问题 可自行查阅。

AtomicBoolean中的几个常用API

  • get():获取当前值
  • set(boolean newValue):设置新值(非原子性)
  • compareAndSet(boolean expect, boolean update):如果当前值(V)等于预期值(E)则将其更新为更新值(U)并返回true
  • getAndSet(boolean newValue):原子性设置新值并返回旧值

AtomicBoolean中的CAS

核心方法:compareAndSet(boolean expect, boolean update)


ReentrantLock

ReentrantLock是一种基于AQS框架实现的应用,是JDK中实现并发编程的手段,它的功能类似synchronized是一种互斥锁,可以保证线程安全。

  • 可重入:同一个线程可以多次获取同一个锁而不会导致死锁
  • 公平性:可以根据线程请求锁的顺序分配(公平锁)
  • 性能上:ReentrantLock更适合复杂的并发场景

ReentrantLock锁会导致整体的吞吐量下降,队列中除了第一个线程 其他的线程都会阻塞(可能会导致其他线程饿死),cpu唤醒其他线程也会带来开销。

注意事项:

  • 确保加锁与解锁配对(解锁放在finally中确保发生异常,也能正常解锁,避免锁一直被占用)
  • 避免出现死锁:多个线程尝试获取多把锁时避免出现死锁问题
    • 锁的顺序要一致:确保不同线程获取锁的顺序相同
    • 尝试获取锁(tryLock)时 要设置等待时间,避免长时间等待
  • 不要长时间占有锁(将锁的作用返回设置到最小化,减少临界区的代码量)
  • 正确处理中断
    • ReentrantLock支持可中断锁,如果线程在等待锁时被中断,会抛出 InterruptedException要能够正确处理

将以上两种方法混合使用(实际上应该是多余的)整体代码结构如下

private ReentrantLock createXXXLock = new ReentrantLock();
private AtomicBoolean createXXXFlag = new AtomicBoolean(false);

if (createXXXFlag.get()) {
            log.info("XXX");
            return;
        }
createXXXLock.lock();
try {
    if (createXXXFlag.compareAndSet(false, true)) {
        try {
            // 业务逻辑处理
            throw new RuntimeException("模拟异常");
        } catch (Exception e) {
            log.error("xxx", e.getMessage());
        } finally {
            // 无论逻辑是否成功,确保标志位被重置
            createXXXFlag.set(false);
        }
    } else {
        log.info("xxxx");
    }
} finally {
    // 确保锁的释放
    createXXXLock.unlock();
}

代码中看到有同事这样使用,故学习一下~~~ 不喜勿喷

标签:false,CAS,ReentrantLock,boolean,线程,AtomicBoolean
From: https://www.cnblogs.com/kuangsun125/p/18583707

相关文章

  • java 多线程同步方法CyclicBarrier/CountDownLatch/AtomicBoolean/Semaphore
    CyclicBarrier 有两个构造函数,CyclicBarrier(int),CyclicBarrier(int,Runnable)目的:通过输入任务数实现线程同步; 使用场景: 多线程计算:当多个线程需要分阶段并行处理数据,但在每一阶段结束时需要所有线程同步,以便开始下一阶段的处理。 并行任务协调:例如,在并行搜索或并行数......
  • 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是三种常用的同步机制。每种机制都有其独特的特性、优缺点和适用场景。理解它们之间的区别以及在何种情况下使用哪种机制,对提高程序的性能和可靠性至关重要。本文将详细探讨这三种机制的特性、使用场景及示例......
  • 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析
    关于ReentrantLock中锁lock()和解锁unlock()的底层原理浅析一、描述如下代码,当我们在使用ReentrantLock进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦?staticLocklock=newReentrantLock();publicstaticvoidmain(String[]args){/......
  • 重入锁ReentrantLock详解
    目录ReentrantLock简介可重入性ReentrantLock的特性中断响应公平锁与非公平锁非阻塞获取锁Condition类与synchronized的比较总结参考ReentrantLock简介重入锁ReentrantLock是Java并发包中提供的一种可重入锁,它相较于Java的synchronized关键字具有更多的功能和更细......
  • ReentrantLock-可重入锁
    ReentrantLock是Java并发包java.util.concurrent.locks中的一个类,它实现了Lock接口,提供了一种与Synchronized方法和语句相同的基本行为和语义的互斥锁,但具有更多的扩展功能。主要特点可重入性与synchronized关键字一样,ReentrantLock允许同一个线程多次获得锁,而不会发生死锁......
  • ReentrantLock源码剖析
    ReentrantLock源码剖析测试案例:publicclassReentrantLockDemo{//ReentrantLocklock=newReentrantLock();//默认是非公平锁//ReentrantLocklock=newReentrantLock(true);//true:公平锁,false:非公平锁publicstaticvoidmain(String[]args){......