AtomicBoolean 源码分析
AtomicBoolean
AtomicBoolean 能解决什么问题?什么时候使用 AtomicBoolean?
可原子更新的 boolean 值
1)原子性:在Java中,对基本数据类型变量的读取和赋值操作是原子性操作,这些操作是不可被中断的,要么执行,要么不执行。
2)可见性:当一个共享变量被 volatile修饰时,它会保证被修改的值会立即更新到主存中,当有其他线程需要读取时,它会去主存中读取新值。
3)有序性:volatile 变量前后的指令不能执行交叉重排序,即 volatile 变量前的代码块总是比 volatile 变量后的代码块先执行。
happens-before原则
1)一个锁的 unlock 操作先行发生于后面对这个锁的 lock 操作。
2)对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作。
3)如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C。
4)Thread对象的start()方法先行发生于此线程的每个一个动作。
5)一个对象的初始化完成先行发生于他的finalize()方法的开始。
如何使用 AtomicBoolean?
1)多个线程需要对指定的 boolean 值进行读写时,AtomicBoolean 相对于 synchronized 具有更高的吞吐量。
使用 AtomicBoolean 有什么风险?
1)高并发场景下,自旋 CAS 长时间失败会导致 CPU 飙升。
AtomicBoolean 核心操作的实现原理?
创建对象
private static final VarHandle VALUE;
static {
try {
final MethodHandles.Lookup l = MethodHandles.lookup();
VALUE = l.findVarHandle(AtomicBoolean.class, "value", int.class);
} catch (final ReflectiveOperationException e) {
throw new Error(e);
}
}
/**
* 底层通过整数表示 boolean 值,1 表示 true,0 表示 false
*/
private volatile int value;
/**
* 创建初始值为 initialValue 的 AtomicBoolean 实例
*/
public AtomicBoolean(boolean initialValue) {
value = initialValue ? 1 : 0;
}
/**
* 创建初始值为 false 的 AtomicBoolean 实例
*/
public AtomicBoolean() {
}
常用操作
/**
* 如果当前值为 expectedValue,则将其设置为 newValue,并返回 true,否则返回 false。
*
* @param expectedValue 期望值
* @param newValue 新值
*/
public final boolean compareAndSet(boolean expectedValue, boolean newValue) {
return AtomicBoolean.VALUE.compareAndSet(this,
expectedValue ? 1 : 0,
newValue ? 1 : 0);
}
/**
* 如果当前值为 expectedValue,则将其设置为 newValue,并返回设置前的原始值。
*
* @param expectedValue 期望值
* @param newValue 新值
* @return 原始值
* @since 9
*/
public final boolean compareAndExchange(boolean expectedValue, boolean newValue) {
return (int)AtomicBoolean.VALUE.compareAndExchange(this,
expectedValue ? 1 : 0,
newValue ? 1 : 0) != 0;
}
/**
* 读取值
* with memory effects as specified by {@link VarHandle#getVolatile}.
*/
public final boolean get() {
return value != 0;
}
/**
* 写入值
* with memory effects as specified by {@link VarHandle#setVolatile}.
*/
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
/**
* 原子写入新值,并返回旧值
*/
public final boolean getAndSet(boolean newValue) {
return (int)AtomicBoolean.VALUE.getAndSet(this, newValue ? 1 : 0) != 0;
}
/**
* 以写入普通变量的方式来修改共享状态,可以减少不必要的内存屏障,从而提高程序的执行效率,
* 但是不保证立即被其他线程可见。
* with memory effects as specified by {@link VarHandle#setRelease}.
*/
public final void lazySet(boolean newValue) {
AtomicBoolean.VALUE.setRelease(this, newValue ? 1 : 0);
}
AtomicBoolean 源码分析的更多相关文章
- MyCat源码分析系列之——配置信息和启动流程
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...
- Hadoop之HDFS原理及文件上传下载源码分析(上)
HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随 ...
- netty源码分析
1.Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.也就是说,Netty 是一个基于N ...
- Android源码分析—深入认识AsyncTask内部机制
本文转载http://blog.csdn.net/singwhatiwanna/article/details/17596225该博主博文,谢谢该博主提供的好文章! 前言 什么是AsyncTask,相 ...
- SpringCloud微服务如何优雅停机及源码分析
目录 方式一:kill -9 java进程id[不建议] 方式二:kill -15 java进程id 或 直接使用/shutdown 端点[不建议] kill 与/shutdown 的含义 Sprin ...
- 分布式缓存技术之Redis_Redis集群连接及底层源码分析
目录 1. Jedis 单点连接 2. Jedis 基于sentinel连接 基本使用 源码分析 本次源码分析基于: jedis-3.0.1 1. Jedis 单点连接 当是单点服务时,Java ...
- Dubbo 源码分析 - 集群容错之 LoadBalance
1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...
- Spring IOC 容器源码分析
声明!非原创,本文出处 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 S ...
- Spring IOC 源码分析
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文 ...
随机推荐
- navicat和Pycharm的连接
要安装好Mysql,并且实现了Mysql和Navicat的连接: 2.连接界面如下:点击连接,然后点击MySQL就可以看到如下界面 3. 然后就出现新建连接的设置,连接名自己起,用户名和密码和在MyS ...
- Vue:Elementui中的Tag与页面其它元素相互交互的两三事
前言 公司系统在用elementui做后台开发,不免遇到一些需要自己去根据原有的功能上,加一些交互的功能.今天来介绍下我在用elementUi里的Tag标签与多选框交互的过程,东西听上去很简单,但就是 ...
- 2. Docker部署tomcat, nginx, redis,及docker私有仓库
1. 部署tomcat 1.1 下载tomcat docker pull tomcat:7-jre8 1.2 部署容器 docker run -di --name=tomcat -p 8 ...
- elementUI 等 UI框架中,@change方法传递参数
有些业务中,在使用 @change 回调的时候需要动态获取当前循环下的特定值,但是@change方法一旦传递参数就会覆盖原本的数据,对此,有两种方法解决: // 这种方法据说会改变 this 指向 ...
- Red Hat Enterprise Linux查看系统版本命令
# arch 返回结果为i686表示32位系统,x86_64表示64位系统. # uname -a # uname -r # lsb_release -a # cat /proc/version # ...
- lilo.conf - lilo 配置文件
描述 默认情况下,本文件 ( /etc/lilo.conf ) 由引导管理程序 lilo 读取 (参考 lilo(8)). 它看起来可能象这样: boot = /dev/hda delay = 40 ...
- 基于双XCKU060+双C6678 的双FMC接口40G光纤传输加速计算卡381
一.板卡概述 板卡采用基于双FPGA+双DSP的信号采集综合处理硬件平台,板卡大小360mmx217mm.板卡两片FPGA提供两个FMC接口,4路QSFP+接口:每片FPGA挂接2簇32-bit DD ...
- Comet OJ - Contest #3 B -棋盘 (思维+分类讨论)
题目描述 小猫有一个 2\times N2×N 的棋盘,每一个格子放着一个黑棋子或白棋子. 小熊觉得小猫的棋盘不够好看,想要把棋盘上的一部分白棋子替换成黑棋子,使得所有黑棋子都能够在仅允许上下左右四个 ...
- express 设置跨域
app.use(function (req, res, next) { res.header('Access-Control-Allow-Origin', 'http://localhost: ...
- ppt打不开,显示发现文件中的内容有问题。可尝试修复此演示文稿
原因分析 主要是因为文件是网络下载的,office自动锁定了文件(默认不可编辑). 解决办法 在文件上右键-属性-解除锁定(最下面),就不会进行检查了,问题也就解决了. ppt文件---右键---属性 ...