java用volatile或AtomicBoolean实现高效并发处理 (只初始化一次的功能要求)

本文介绍了一种在并发环境中确保类方法仅初始化一次的技术。通过使用volatile变量与AtomicBoolean两种方式来实现,确保了线程安全性。

最近碰到一个这样的功能要求:怎么在一个类里面,实现高效并发处理下只可以初始化一次的方法?

实现方式:

1)volatile方式:

/**
 * Created by Chengrui on 2015/7/28.
 */
public class MyThread {

    private static volatile boolean initialized = false;

    public void init(){
        if(initialized == false){
            initialized = true;
            //here is the initialization code
        }
    }

}

2)AtomicBoolean方式:

/**
 * Created by Chengrui on 2015/7/28.
 */
public class MyThread {

    private static AtomicBoolean initialized = new AtomicBoolean(false);

    public void init(){
        if(initialized.compareAndSet(false, true)){
            //here is the initialization code
        }
    }

}
附:AtomicBoolean帮助文档:




### Java实现代码块仅执行一次的最佳实践 为了确保一段特定的初始化逻辑只被执行一次,在Java中有多种方式来达成这一目标。一种常见的方式是利用双重检查锁定模式(Double-Checked Locking Pattern),结合`volatile`变量和`synchronized`关键字,这不仅能够满足需求还能提供较好的性能。 下面是一个使用静态内部类单例模式的例子,该模式天然支持懒加载并能保证实例化过程的安全性: ```java public class Singleton { private static volatile Helper helper; public static void initializeHelper() { if (helper == null) { // First check before acquiring the lock synchronized (Singleton.class) { if (helper == null) { // Second check after getting the lock helper = new Helper(); } } } } private static class HolderClass { private final static Helper INSTANCE = new Helper(); } public static Helper getHelperInstance() { return HolderClass.INSTANCE; } } ``` 另一种更为简洁且高效的做法是在JDK 1.5之后引入的枚举类型来创建单例对象,这种方式不仅能防止多次实例化,还提供了序列化的机制以及防止反编译的可能性[^1]。 对于只需要确保某个动作资源初始化仅发生一次的情况,还可以考虑采用`java.util.concurrent.atomic.AtomicBoolean`作为标志位,配合其他同步手段一起工作;者是直接依赖于`java.util.concurrent.locks.ReentrantLock`所提供的特性来进行更加细粒度的控制[^3]。 当涉及到复杂的并发环境时,推荐尽可能缩小加锁范围以减少争用带来的开销,并充分利用现有的并发工具类库提供的高级功能[^2]。 #### 使用 `AtomicBoolean` 实现一次性执行 ```java import java.util.concurrent.atomic.AtomicBoolean; class OneTimeInitializer { private final AtomicBoolean initialized = new AtomicBoolean(false); public void initOnce(Runnable action) { if (!initialized.get()) { synchronized (this) { if (!initialized.getAndSet(true)) { action.run(); // Perform initialization here. } } } } } ``` 上述代码展示了如何借助`AtomicBoolean`与显式的同步语句相结合的方式来保障某些操作只会被执行一次。此方法适用于那些希望保持简单但又不失效性的场合。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值