`
haoran_10
  • 浏览: 443189 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用AtomicBoolean优雅初始化资源

阅读更多

在很多场景中,都需要用到加载资源等初始化操作,而且只需要初始化一次,那么问题就有了,

  1. 如何判断为初次操作
  2. 如果是并发处理,如何保证只初始化一次,不会重复初始化

 

一、AtomicBoolean神器

java.util.concurrent.atomic.AtomicBoolean ,该布尔操作类保证了一系列的操作都是原子操作,不会受到多线程环境下的并发不安全问题,原理则是依赖神奇的sun.misc.Unsafe支持。

 

 

二、推荐使用步骤

 

public class InitXxxService{
    
    private AtomicBoolean initState = new AtomicBoolean(false);

    @Override
    public void init() {
        if (! initState.compareAndSet(false, true)) {//init once
            return ;
        }
        
        //TODO 写初始化代码
    }
}

 

三、原理简介

 

public final boolean compareAndSet(boolean expect, boolean update) ;

 

 

这个方法的意思是,如果当前AtomicBoolean对象的值与expect相等,那么我们就去更新值为update,并且返回true,否则返回false

 

这里其实做了两件事:

  1. 当前值与expect相比较。如果相等继续第二步,如果不相等直接返回false
  2. 把当前值更新为update,并返回为true

 

 

这两步是原子操作,这样就解决了初始化中多线程环境下的并发安全问题。

0
1
分享到:
评论

相关推荐

    03_once4l3_welcomethread_

    在 Java 中,确保操作只执行一次的常见方式是使用 `java.util.concurrent.atomic.AtomicBoolean` 或 `java.lang.ThreadLocal`,以及 `synchronized` 关键字来实现单例模式或者初始化逻辑。"once4l3" 可能是指这种一...

    java并发包资源

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...

    java线程-Atomic的含义及示例_.docx

    System.out.println("实现只初始化一次的功能"); } } public void run() { while (true) { if (wakeupPending.compareAndSet(false, true)) { System.out.println(name + " enter"); System.out.println...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器的详细介绍.mp4 │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下...

    JUC并发工具包实例.zip

    CountDownLatch是一个计数器,初始化时设定一个计数值,线程执行完特定任务后会调用countDown()方法,每次调用都会使计数值减1。所有线程都在等待时,当计数值为0时,所有等待的线程会被释放,可以继续执行。这个...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器的详细介绍.mp4 │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下...

    高并发常见面试题(深入底层).docx

    `,如果发生了重排序,则线程B可能在`a`还没有被初始化的情况下就读取了`b`的值,从而导致不一致的结果。 #### 三、原子性保证机制 **3.1 synchronized关键字** `synchronized`关键字是Java中保证原子性的最常用...

    并发编程 75 道面试题及答案.docx

    通过本资源,读者可以了解并发编程的基本概念、线程的分类、线程的生命周期、线程调度算法、线程同步机制、死锁、活锁、饥饿等,并学习如何使用 Java 语言实现并发编程。 知识点: 1. 线程和进程的区别:进程是...

    Java并发编程

    另外,final关键字用于确保初始化字段一旦被赋值就不可改变,有助于线程安全。 Java并发编程还涉及线程安全的数据结构,如ConcurrentHashMap、ConcurrentLinkedQueue等,它们在内部实现了线程安全的算法,提高了...

    多个线程到达后才能执行某个任务,并且只能执行一次

    `AtomicExecute`这个名字可能表示一个类,它使用了这些原子类来确保某次执行(可能是初始化或更新某个状态)是线程安全的。 在描述中提到的博客链接虽然没有提供具体内容,但我们可以猜测博主可能讲解了如何使用...

    tuixiangzi_java_atomicpw4_

    5. **Java并发与原子操作**:“atomicpw4”标签暗示了项目中可能使用了Java并发工具包(java.util.concurrent.atomic)中的原子类,如AtomicInteger或AtomicBoolean,以保证在多线程环境下对游戏状态的更新是线程...

    [Java并发编程实践].(Java.Concurrency.in.Practice).Brian.Goetz.文字版(1)

    9. **并发编程最佳实践**:作者提供了许多实用的建议,如避免过度同步、最小化锁的粒度、使用并发工具而不是直接使用synchronized等,以提高并发程序的效率和可维护性。 10. **Java内存模型**:Java内存模型(JMM)...

    java并发编程之cas详解

    例如,使用AtomicBoolean类可以实现锁机制,使用AtomicInteger类可以实现计数器等。 CAS技术的优点 CAS技术的优点是可以在多线程环境中确保原子操作的正确执行,提高了程序的稳定性和可靠性。同时,CAS技术也可以...

    并发编程——原子操作CAS.pdf

    这指的是一个变量在多个线程之间进行过多次修改,但实际上最终的值和初始值相同,从而导致某些操作可能会忽略掉中间的变化。对此问题,通常需要额外的版本号或其他机制来检测变量值的变化。 总而言之,这份文档是...

    java并发工具类

    并发问题主要包括资源竞争、死锁、活锁以及饥饿等,合理使用并发工具可以有效地提高程序的并发性能并确保线程安全。 ### 1. Tools #### 1.1. CountDownLatch `CountDownLatch`是一个计数器,它初始化为一个非负...

    java面试题_多线程(68题)

    23. **线程安全的初始化**:单例模式的双检锁(DCL)和静态内部类等实现方式。 24. **线程安全的日期时间类**:Java 8引入的`java.time`包中的类是线程安全的,替代了旧的`java.util.Date`和`Calendar`。 25. **...

Global site tag (gtag.js) - Google Analytics