文档章节

使用AtomicBoolean优雅初始化资源

haoran_10
 haoran_10
发布于 2016/07/15 16:37
字数 306
阅读 101
收藏 0

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

  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

 

 

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

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
私信 提问
AtomicBoolean使用

使用 AtomicBoolean 高效并发处理 “只初始化一次” 的功能要求: private static AtomicBoolean initialized = new AtomicBoolean(false); public void init(){if( initialized.compareAnd......

山哥
2012/05/21
0
0
我们常说的 CAS 自旋锁是什么

CAS(Compare and swap),即比较并交换,也是实现我们平时所说的自旋锁或乐观锁的核心操作。 它的实现很简单,就是用一个预期的值和内存值进行比较,如果两个值相等,就用预期的值替换内存值...

风的姿态
2018/05/10
0
0
【转】 Java 并发工具包 java.util.concurrent 用户指南

http://blog.csdn.net/defonds/article/details/44021605译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html。......

围城以北
2016/03/09
50
0
Java 并发工具包 java.util.concurrent 用户指南

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html。 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友...

pior
2015/10/26
0
0
AtomicBoolean介绍与使用 java.lang.Object

java.lang.Object java.util.concurrent.atomic.AtomicBoolean 继承自Object。 介绍: 在这个Boolean值的变化的时候不允许在之间插入,保持操作的原子性 方法和举例 compareAndSet(boolean ...

vshcxl
2016/12/25
4
0

没有更多内容

加载失败,请刷新页面

加载更多

求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
41分钟前
2
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
53分钟前
2
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
今天
1
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
今天
1
0
java8的时间和`Date`的对比

java8的时间和Date的对比 java8提供了新的时间接口。相对Date,Calendar,个人感觉最大的好处是对时间操作的学习成本很低,比Calendar低。 1. LocalDate,LocalTime,LocalDateTime LocalDate 代...

北风刮的不认真了
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部