2019独角兽企业重金招聘Python工程师标准>>>

类图:

源码

package java.util.concurrent.atomic;import sun.misc.Unsafe;public class AtomicBoolean implements java.io.Serializable {private static final long serialVersionUID = 4654671469794556979L;//版本号private static final Unsafe unsafe = Unsafe.getUnsafe();//使用sun的Unsafe完成cas指令private volatile int value;//value=1则为true;value=0,则为false.设为volatile,保证线程之间的可见性private static final long valueOffset;//value内存地址相对于对象内存地址的偏移量static {try {///初始化valueOffset:通过unsafe.objectFieldOffset方法获取成员属性value内存地址相对于对象内存地址的偏移量valueOffset = unsafe.objectFieldOffset(AtomicBoolean.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}/*** 构造方法:使用默认值0*/public AtomicBoolean() {}/*** 构造方法:true初始化为1,false初始化为0*/    public AtomicBoolean(boolean initialValue) {value = initialValue ? 1 : 0;}/*** 获取boolean值.为1返回true,为0返回false*/public final boolean get() {return value != 0;}/*** 将boolean转化为对应取值,将value设为该取值*/public final void set(boolean newValue) {value = newValue ? 1 : 0;}/*** 最终设为指定值,但其它线程不能马上看到变化,会延时一会*/public final void lazySet(boolean newValue) {int v = newValue ? 1 : 0;//将boolean转化为对应取值unsafe.putOrderedInt(this, valueOffset, v);}/*** 以原子方式设置为给定值,并返回旧值*/public final boolean getAndSet(boolean newValue) {boolean prev;do {prev = get();//读取当前value对应的boolean值} while (!compareAndSet(prev, newValue));//调用下方的compareAndSet方法,设置成功,才能退出循环return prev;//返回最后一次读取的值}/*** CAS操作,现代CPU已广泛支持,是一种原子操作;* 简单地说,当期待值expect与valueOffset地址处的值相等时,设置为update值*/public final boolean compareAndSet(boolean expect, boolean update) {int e = expect ? 1 : 0;//转换为期望值的取值int u = update ? 1 : 0;//转换为更新值的取值return unsafe.compareAndSwapInt(this, valueOffset, e, u);}//和compareAndSet()方法相同public boolean weakCompareAndSet(boolean expect, boolean update) {int e = expect ? 1 : 0;int u = update ? 1 : 0;return unsafe.compareAndSwapInt(this, valueOffset, e, u);}//读取当前value对应的boolean值,返回字符串形式的true或者falsepublic String toString() {return Boolean.toString(get());}}

基本上,AtomicBoolean 实现和 AtomicInteger 的实现差不多。只是 AtomicBoolean 的value 只能取值 1 和 0

转载于:https://my.oschina.net/langwanghuangshifu/blog/2878945

java.util.concurrent.atomic.AtomicBoolean 源码相关推荐

  1. java.util.concurrent.locks.Condition 源码

    2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...

  2. java.util.concurrent.Callable 接口 源码

    2019独角兽企业重金招聘Python工程师标准>>> 线程池相关 源码: package java.util.concurrent;@FunctionalInterface pub ...

  3. java.util.concurrent.ExecutorService 接口 源码

    2019独角兽企业重金招聘Python工程师标准>>> 线程池相关 源码: package java.util.concurrent;import java.util.List; i ...

  4. 【JDK源码】java.util.concurrent.atomic包常用类详解

    java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...

  5. java.util.concurrent.atomic原子操作类包

    2019独角兽企业重金招聘Python工程师标准>>> 这个包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当 ...

  6. 【问题已解决】Unrecognized option: --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED

    今天在创建java项目时,运行报错,说无法成功创建java程序. Unrecognized option: --add-opens=java.base/java.util.concurrent.ato ...

  7. java.util 1.8_JDK1.8源码(四)——java.util.Arrays 类

    java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList public static ...

  8. 解决 Unrecognized option: --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED 【实测有效】

    https://blog.csdn.net/mengxiang_/article/details/128601475

  9. 聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类

    这篇说说java.util.concurrent.atomic包里的类,总共12个,网上有很多文章解析这几个类,这里挑些重点说说. 这12个类可以分为三组: 1. 普通类型的原子变量 2. 数组类型的 ...

  10. 聊聊高并发(十七)解析java.util.concurrent各个组件(一) 了解sun.misc.Unsafe类

    了解了并发编程中锁的基本原理之后,接下来看看Java是如何利用这些原理来实现各种锁,原子变量,同步组件的.在开始分析java.util.concurrent的源代码直接,首先要了解的就是sun.mis ...

最新文章

  1. vim学习第2篇:配置自己的vimrc
  2. 空气动力学测试软件,山寨也精确 简单方法测试最佳空气动力学姿势(图文)
  3. 排序算法 —— 选择排序
  4. 计算机总是无法响应怎么办,电脑无响应是怎么回事 电脑无响应解决方法
  5. python注销代码_django用户注册、登录、注销和用户扩展的示例
  6. 10. OD-VC程序暴力破解
  7. 构造方法 c# 0106
  8. 【C语言】指针进阶 - 指针数组 数组指针 数组指针传参 函数指针 指向函数指针数组的指针
  9. 波特率、发送/接收时钟、波特率因子、传输距离
  10. TakeColor 屏幕取色器 8.0 中文绿色版
  11. php cas 票据认证失败,解决CAS客户端验证ST票据时发生的TicketValidationException问题...
  12. 高端玩家的运营与维护
  13. 431 Request Header Fields Too Large 解决
  14. dytt 爬取磁力链接保存mysql
  15. html5视频在线剪辑,五种剪辑方法让视频更精彩
  16. VM虚拟机安装CentOS7系统后连接不上网络的问题(service netword restart)重启网卡和重置网络编译器
  17. 步进电机运动八大算法
  18. 计算机系统平台复习提纲
  19. jQuery实现商品楼层的感觉
  20. [附源码]计算机毕业设计JAVA全国人口普查管理系统论文

热门文章

  1. 从0到1亿美元 ---- PopCap创始人John Vechey自述(zt)
  2. 考场自动安排工具开发手记
  3. 拜山贴(COM+中的连接复用)
  4. kmean法和dbscan法的直观比较
  5. 图像分割学习笔记_1(opencv自带meanshift分割例子)
  6. 【Matlab学习笔记】【编程实例】二(将两幅灰度图片调整成相同的尺寸,然后左右拼接到一起)
  7. 基于阈值分解的多级中值滤波-附代码
  8. Landsat9卫星简介
  9. cartopy模块介绍与安装
  10. cordova自定义插件步骤