在很多场景中,都需要用到加载资源等初始化操作,而且只需要初始化一次,那么问题就有了,
- 如何判断为初次操作
- 如果是并发处理,如何保证只初始化一次,不会重复初始化
一、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
这里其实做了两件事:
- 当前值与expect相比较。如果相等继续第二步,如果不相等直接返回false
- 把当前值更新为update,并返回为true
这两步是原子操作,这样就解决了初始化中多线程环境下的并发安全问题。
相关推荐
在 Java 中,确保操作只执行一次的常见方式是使用 `java.util.concurrent.atomic.AtomicBoolean` 或 `java.lang.ThreadLocal`,以及 `synchronized` 关键字来实现单例模式或者初始化逻辑。"once4l3" 可能是指这种一...
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...
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顺便问候了一下...
CountDownLatch是一个计数器,初始化时设定一个计数值,线程执行完特定任务后会调用countDown()方法,每次调用都会使计数值减1。所有线程都在等待时,当计数值为0时,所有等待的线程会被释放,可以继续执行。这个...
│ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器的详细介绍.mp4 │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下...
`,如果发生了重排序,则线程B可能在`a`还没有被初始化的情况下就读取了`b`的值,从而导致不一致的结果。 #### 三、原子性保证机制 **3.1 synchronized关键字** `synchronized`关键字是Java中保证原子性的最常用...
通过本资源,读者可以了解并发编程的基本概念、线程的分类、线程的生命周期、线程调度算法、线程同步机制、死锁、活锁、饥饿等,并学习如何使用 Java 语言实现并发编程。 知识点: 1. 线程和进程的区别:进程是...
另外,final关键字用于确保初始化字段一旦被赋值就不可改变,有助于线程安全。 Java并发编程还涉及线程安全的数据结构,如ConcurrentHashMap、ConcurrentLinkedQueue等,它们在内部实现了线程安全的算法,提高了...
`AtomicExecute`这个名字可能表示一个类,它使用了这些原子类来确保某次执行(可能是初始化或更新某个状态)是线程安全的。 在描述中提到的博客链接虽然没有提供具体内容,但我们可以猜测博主可能讲解了如何使用...
5. **Java并发与原子操作**:“atomicpw4”标签暗示了项目中可能使用了Java并发工具包(java.util.concurrent.atomic)中的原子类,如AtomicInteger或AtomicBoolean,以保证在多线程环境下对游戏状态的更新是线程...
9. **并发编程最佳实践**:作者提供了许多实用的建议,如避免过度同步、最小化锁的粒度、使用并发工具而不是直接使用synchronized等,以提高并发程序的效率和可维护性。 10. **Java内存模型**:Java内存模型(JMM)...
例如,使用AtomicBoolean类可以实现锁机制,使用AtomicInteger类可以实现计数器等。 CAS技术的优点 CAS技术的优点是可以在多线程环境中确保原子操作的正确执行,提高了程序的稳定性和可靠性。同时,CAS技术也可以...
这指的是一个变量在多个线程之间进行过多次修改,但实际上最终的值和初始值相同,从而导致某些操作可能会忽略掉中间的变化。对此问题,通常需要额外的版本号或其他机制来检测变量值的变化。 总而言之,这份文档是...
并发问题主要包括资源竞争、死锁、活锁以及饥饿等,合理使用并发工具可以有效地提高程序的并发性能并确保线程安全。 ### 1. Tools #### 1.1. CountDownLatch `CountDownLatch`是一个计数器,它初始化为一个非负...
23. **线程安全的初始化**:单例模式的双检锁(DCL)和静态内部类等实现方式。 24. **线程安全的日期时间类**:Java 8引入的`java.time`包中的类是线程安全的,替代了旧的`java.util.Date`和`Calendar`。 25. **...