AtomicInteger小小的理解
这里仅仅是验证多线程环境下,AtomicInteger的安全性。
通过源码不难发现两点:
1、value属性是volatile修饰
2、使用了unsafe的CAS操作
通过上述两点,实现非阻塞同步(乐观锁),实现线程安全。
/**
* 验证在并发情况下,AtomicInteger的线程安全性
* AtomicInteger并不是通过互斥同步(Syncronized)实现的
* 其value属性用volatile修饰,保证其可见性(对对象的修改,对其他线程立即可见)
* 同时,通过 CAS(compare and swap)这一原子操作,保证其多线程安全
*
* Atomically increments by one the current value.
* public final int incrementAndGet() {
for (;;) {
int current = get(); // 获取volatile value最新值
int next = current + 1; // 期望值,也就是本次执行后的值,这里是自增1
if (compareAndSet(current, next)) // 使用CAS这一原子操作比较current,如果相同,则将next这个新值设置进去;如果current发生变化,则继续循环取值-CAS操作
return next;
}
}
*
* @author zhuotao
*
*/
public class AtomicIntegerTest {
private static AtomicInteger atomInt = new AtomicInteger();
private static final int THREAD_COUNT = 20;
public static void main(String[] args) {
Thread[] threads = new Thread[THREAD_COUNT];
for(int i = 0; i < THREAD_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for(int j = 0; j < 1000; j++) {
atomInt.incrementAndGet();
}
}
});
threads[i].start();
}
while(Thread.activeCount() > 1) Thread.yield(); // 如果在当前thread group中仍然存在活跃线程,执行yield操作,通知调度器放弃当前使用的procesor
System.out.println(atomInt.get());
}
}
AtomicInteger小小的理解的更多相关文章
- AngularJS』一点小小的理解
『AngularJS』一点小小的理解 AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与 ...
- 『AngularJS』一点小小的理解
AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与开发框架不断的提出与发展,而就目前来说,除 ...
- 关于VUe的生命周期小小的理解
实例化初始化->beforeCreate()->数据监测->事件配置->实例已经创建完成(created),在这一步,实例已完成以下的配置:数据观测(data observer ...
- 你是怎么理解“MVC”的
MVC就是三个字母的组合,M-模型, V-视图, C-控制器. 这些在百度上随便一索就可以索到,而且网上对这三个部分的解释又过于笼统,使人没法完全理解MVC的含义. 这里我简单的谈谈我对MVC这三 ...
- 嵌入式Linux框架的理解
从事嵌入式linux工作也几年了,如果算上大学期间的自学,那么也算是个工程师了.期间写过底层bootloader.内核的驱动和上层应用程序.对于芯片内部的模块也在大学时候用fpga的verilog玩过 ...
- 对JavaScript中异步同步机制以及线程深入了解
今天在网上看到各种对Js异步同步单线程多线程的讨论 经过前辈们的洗礼 加上鄙人小小的理解 就来纸上谈兵一下吧~ Js本身就是单线程的 至于为什么Js是单线程的 那就要追溯到Js的历史了 总而言之 由于 ...
- 利用ADSL拨号上网方式如何搭建服务器
序:搭建服务器需要两个条件硬件服务器和固定公网IP,随便一台个人电脑都可以作为硬件服务器,就剩下一个问题,如何获得一个固定公网IP. 第一章 扫盲:ADSL拨号上网方式,本地IP与公网IP的区别 一. ...
- js中的“闭包”
js中的“闭包” 姓名:闭包 官方概念:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的 ...
- IIS8中使用OpenSSL来创建CA并且签发SSL证书
前言 [转载]http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certi ...
随机推荐
- mysql oracle静默 一键安装脚本
pre-read; 为了达到一键搞定的目的!现Ruiy简单做如下几小条规定 如果你想这么一键来搞定请君莫要违背约束! 1. 下载 `二进制` mysql软件介质版本不限,二进制包务必,源码及rpm ...
- Java中可变长参数的方法
原文转自:http://www.cnblogs.com/lanxuezaipiao/p/3190673.html 在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定 ...
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)
4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...
- 在自己电脑上建立SVNserver
转载处:http://blog.csdn.net/shmily570/article/details/8227690 传统的Subversionserver配置方法: 一.准备工作 1.获取 Subv ...
- [Angular 2] Using Two Reducers Together
Add another reducer: export const SECOND = "SECOND"; export const HOUR = "HOUR"; ...
- 阻塞机制下的recv小结
recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结. 首先阻塞 ...
- js中的for...in循环机制
1) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.o ...
- 2008年NOI全国竞赛 假面舞会
/* 分三种情况 1 有环:找环长的gcd作为max gcd的超过2的最小因子作为min 2 树:所有最长链的和作为max 3为min (最长链≥3) 3 两条相交链:找出所有的这样的两条链的差 同1 ...
- C# Byte[]数组读取和写入文件
这个项目我用的是asp.net构建的,代码如下 protected void ByteToString_Click(object sender, EventArgs e) { string conte ...
- .net 中序列化和反序列化的使用
序列化的目的:将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 序列化 序列化分为JSON 序列化,XML序列化,二 ...