ToB企服应用市场:ToB评测及商务社交产业平台

标题: AtomicBoolean与ReentrantLock [打印本页]

作者: 三尺非寒    时间: 2024-12-3 10:29
标题: AtomicBoolean与ReentrantLock
AtomicBoolean

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

CAS的核心思想是'比较和交换'
如果内存中的值与预期值相称,则将其更新为新值,否则什么都不操纵。
三个操纵数:内存值(V,被操纵的变量存在内存中)预期值(E,操纵前线程认为的值应该是此值)更新值(U,如果内存值与预期值相称则更新为此值)
比较V&E--> 如果V== E 把V的值更新为U,并返回true;--> 如果V!=E 则不更新V值,并返回false
底层是依赖CPU的硬件指令来实现。体现的是一种无锁机制,不须要通过显式的加锁解锁来控制线程的执行,避免了线程上下文切换带来的开销。
CAS的一些缺点 如ABA题目 可自行查阅。
AtomicBoolean中的几个常用API

AtomicBoolean中的CAS

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



ReentrantLock

ReentrantLock是一种基于AQS框架实现的应用,是JDK中实现并发编程的本事,它的功能类似synchronized是一种互斥锁,可以保证线程安全。
ReentrantLock锁会导致整体的吞吐量下降,队列中除了第一个线程 其他的线程都会阻塞(大概会导致其他线程饿死),cpu唤醒其他线程也会带来开销。


注意事项:
将以上两种方法混合利用(实际上应该是多余的)整体代码布局如下
  1. private ReentrantLock createXXXLock = new ReentrantLock();
  2. private AtomicBoolean createXXXFlag = new AtomicBoolean(false);
  3. if (createXXXFlag.get()) {
  4.             log.info("XXX");
  5.             return;
  6.         }
  7. createXXXLock.lock();
  8. try {
  9.     if (createXXXFlag.compareAndSet(false, true)) {
  10.         try {
  11.             // 业务逻辑处理
  12.             throw new RuntimeException("模拟异常");
  13.         } catch (Exception e) {
  14.             log.error("xxx", e.getMessage());
  15.         } finally {
  16.             // 无论逻辑是否成功,确保标志位被重置
  17.             createXXXFlag.set(false);
  18.         }
  19.     } else {
  20.         log.info("xxxx");
  21.     }
  22. } finally {
  23.     // 确保锁的释放
  24.     createXXXLock.unlock();
  25. }
复制代码
代码中看到有同事这样利用,故学习一下~~~ 不喜勿喷

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4