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());
}
}
最新文章
- 关于springMVC+Mybatis jar包详解
- (十二) WebGIS中矢量图层的设计
- mysql登录不了及修改密码
- Unity3D骨骼动画的分解(CleanData.Ani详解)
- SharePoint 2013 配置HTTPS(SSL)
- METEOR 及ANGULARJS
- centos7 gitlab
- Log4j2常见使用示例及Syslog/Syslog-ng
- 使用EasyUI要引入哪些文件
- open_clientfd(char* hostname,int port)和open_listenfd(int port)
- Delphi里的RTTI与反射(举例换掉FOnChange)
- mongodb3.2系统性学习——2、write concern mongodb 写安全机制
- 4d tensor
- shell脚本练习
- iOS 之 编外知识点
- FT 软件项目管理
- 2018年2月19日我的java学习(——)
- 017_nginx重定向需求
- 开启Apache Server Status
- MyEclipse 智能提示设置