线程安全的AtomicLong使用
来源:互联网 发布:淘宝购物积分怎么用 编辑:程序博客网 时间:2024/05/21 15:46
atomiclong 可以理解是加了synchronized的long。
public class Counter { private static long counter = 0; public static long addOne(){ return ++counter; } }
这个类在多线程的环境下就会有问题了,假如开多个线程都来使用这个计数类,它会表现的“不稳定”
public static void main(String[] args) { for(int i=0;i<100;i++){ Thread thread = new Thread(){ @Override public void run() { try { Thread.sleep(100); if(Counter.addOne() == 100){ System.out.println("counter = 100"); } } catch (InterruptedException e) { e.printStackTrace(); } } }; thread.start(); } }
程序会开100个线程,每个线程都会把counter 加一。那么应该有一个线程拿到counter =100的值,但实际运行情况是大多数据情况下拿不到100,在少数情况能拿到100.
因为 Counter 类在 addOne()方法被调用时,并不能保证线程的安全,即它不是原子级别的运行性,而是分多个步骤的。
打个比方:线程1首先取到counter 值,比如为10,然后它准备加1,这时候被线程2占用了cpu,它取到counter为10,然后加了1,得到了11。这时线程1 又拿到了CPU资源,继续它的步骤,加1为11,然后也得到了11。这就有问题了。
那么怎么解决它呢?JDK在concurrent包里提供了一些线程安全的基本数据类型的实现,比如 Long型对应的concurrent包的类是AtomicLong。
现在修改下代码:
import java.util.concurrent.atomic.AtomicLong; public class Counter { private static AtomicLong counter = new AtomicLong(0); public static long addOne() { return counter.incrementAndGet(); } }
运行了多次,结果都是能输出counter = 100。
所以在多线程环境下,可以简单使用AtomicXXX 使代码变得线程安全。
转载出处:http://blog.csdn.net/yaqingwa/article/details/17737771
阅读全文
0 0
- 线程安全的AtomicLong使用
- 线程安全的AtomicLong使用
- 线程安全的AtomicLong使用
- 分享个java线程安全,自增主键id的类AtomicLong
- AtomicLong的incrementAndGet()
- AtomicLong
- AtomicLong
- linux 线程安全 mutex 锁的使用
- 多线程要使用线程安全的函数
- 如何线程安全的使用HashMap
- 如何线程安全的使用HashMap
- 使用线程安全的单个实例变量
- 如何线程安全的使用 HashMap
- 如何线程安全的使用HashMap
- 如何线程安全的使用 HashMap
- HashMap--如何线程安全的使用
- 如何线程安全的使用HashMap
- 如何使用线程安全的HashMap
- jQuery
- hdu 1863 畅通工程 (prim与并查集)
- Android studio 实现多分包(多个dex文件)技术详解
- 牛客网JavaScript在线编程题语言选择问题
- WEB前端-HF-HTML5Programming-笔记-CH3 事件与处理程序
- 线程安全的AtomicLong使用
- 假设检验(t-test)
- 隐藏多余cell
- SMOJ 2201 D (线段树)
- 数位DP专题小结--by sgx 数位DP专题小结--by sgx
- POJ 1852 Ants
- iOS系统的各种设备识别码
- OpenCV矩阵运算之顶点法向量计算
- Eclipse快捷键大全