文档章节

使用AtomicBoolean优雅初始化资源

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

精选30+云产品,助力企业轻松上云!>>>

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

  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
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
多线程(6)-Compare-and-swap

1、java原子类 在java.util.concurrent.atomic下有一些原子操作类,例如: 有一些类似的方法,比如: AtomicBoolean有 public final boolean compareAndSet(boolean expect, boolean update)...

haoran_10
2016/07/22
28
0
java多线程目录

多线程(0)-线程状态 多线程(1)-java多线程入门 多线程(2)-使用synchronized进行线程同步 多线程(3)-基于Object的线程等待与唤醒 多线程(4)-多线程之让步&休眠 多线程(5)-使用joi...

haoran_10
2016/07/18
28
0
分布式对象存储Ambry(4)Ambry-Server模块源代码解析(启动与整体通信工作篇)

Ambry一共有三个主模块:Ambry-Server,Ambry-Frontend还有Ambry-Admin。其中,Ambry-Server为其核心,我们从核心开始,一部一部剖析其源码,并会分析它的设计模式。 一个提供各种服务的服务...

zhxhash
2017/12/13
20
0
从小白的角度看Spring核心流程概览(XML版)-初始化容器前的准备工作

1.0、创建ClassPathXmlApplicationContext类,并将xml文件路径放入构造函数中 1.1、首先我们进入构造函数中: 1.1、进入super方法 这里一直往上调了好几层ClassPathXmlApplicationContext->A...

葩_
2018/09/23
71
0
AtomicBoolean使用

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

山哥
2012/05/21
4.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

要求jQuery在执行某些操作之前等待所有图像加载的官方方式

问题: In jQuery when you do this: 在jQuery中,当您执行以下操作时: $(function() { alert("DOM is loaded, but images not necessarily all loaded");}); It waits for the DOM t......

法国红酒甜
昨天
11
0
实现Map按值排序

Map按照值排序,需要自定义比较器,实现Comparator接口,实现compare方法。 public class SortByVlue {public static void main(String[] args) {Map<String, Long> map = new HashMap<......

游人未归
昨天
16
0
定天气爬虫加定时发送天气邮件

今天无聊,在家研究个爬虫玩玩 主要用到以下几个库: request 请求资源 iconv-lite转码,有的网站html格式不是utf-8 cheerio类似jq,操作html,获取相关爬虫数据 nodemailer 发送邮件,例如q...

莫西摩西
昨天
14
0
还在为大屏分辨率困扰?图扑提供响应式(自适应)可视化大屏

前言 数据可视化在当下信息时代已经成为炙手可热的话题,而 B/S 化趋势,也使得许多大屏应用上在网页端出现,今天给大家分享一套不一样风格的大屏页面,与传统深蓝色不同,这次采用了暗红色设...

xhload3d
昨天
20
0
如何妙用Spring 数据绑定机制

前言 在剖析完 Spring Boot 返回统一数据格式是怎样实现的?文章之后,一直觉得有必要说明一下 Spring's Data Binding Mechanism 「Spring 数据绑定机制」。 默认情况下,Spring 只知道如何转...

码农小胖哥
2019/12/27
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部