文档章节

使用AtomicBoolean优雅初始化资源

haoran_10
 haoran_10
发布于 2016/07/15 16:37
字数 306
阅读 86
收藏 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),即比较并交换,也是实现我们平时所说的自旋锁或乐观锁的核心操作。 它的实现很简单,就是用一个预期的值和内存值进行比较,如果两个值相等,就用预期的值替换内存值...

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

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

pior
2015/10/26
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
AtomicBoolean介绍与使用 java.lang.Object

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

vshcxl
2016/12/25
4
0

没有更多内容

加载失败,请刷新页面

加载更多

FinderWeb2.4.9 程序员的看日志利器

FinderWeb2.4.9 程序员的看日志利器 使用方法:管理员登录,分配对应用户的的主机和文件权限即可。 部署方式: 下载并解压到webapps目录即可 http://www.finderweb.net/download/finder-web...

吴伟祥
17分钟前
1
0
PHP的pcntl进程控制教程一(pcntl_fork)

pcntl 简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 这份文档...

hansonwong
23分钟前
1
0
php扩展模块安装

11月21日任务 11.32 php扩展模块装安装 /usr/local/php/bin/php -m //查看模块 下面安装一个redis的模块 cd /usr/local/src/ wget https://codeload.github.com/phpredis/phpredis/zip/deve......

zgxlinux
23分钟前
3
0
windows下使用IDEA创建VUE项目

1.环境搭建 1.1检测是否安装好nodejs和npm 检测命令 node -v npm -v 如果没有安装需要先安装 nodejs的下载路径:https://nodejs.org/en/download/ 在Windows上安装时务必选择全部组件,包括勾...

文文1
31分钟前
3
0
Mybatis插件plugin应用测试,替换查询sql

1、新建插件 import org.apache.ibatis.executor.CachingExecutor;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.parameter.ParameterHandler;im......

jcc_codingBoy
35分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部