java AtomicInteger、AtomicLong原理分析及测试实例
2017-05-17 20:15
561 查看
AtomicInteger、AtomicLong可以理解为乐观锁,它们认为变量值是不会改变,等去设置值的时候去确认。这种方式适用于该变量值很少更改的情况下,否则性能适得其反。
CAS(乐观锁算法)的基本假设前提
CAS比较与交换的伪代码可以表示为:
do{
备份旧数据;
基于旧数据构造新数据;
}while(!CAS( 内存地址,备份的旧数据,新数据 ))
下面写了个多线程的例子:
发现红色圈的区域了吧,由于多线程,导致 Thread-3的线程将值设为1的时候失败,原因是0已经被Thread-0的线程设置为1了。所以Thread-3的线程设置失败,最后循环重新取出了最新的值1,然后Thread-3将值继续设置为1,返回true。
CAS(乐观锁算法)的基本假设前提
CAS比较与交换的伪代码可以表示为:
do{
备份旧数据;
基于旧数据构造新数据;
}while(!CAS( 内存地址,备份的旧数据,新数据 ))
下面写了个多线程的例子:
package com.zc.thread; import java.util.concurrent.atomic.AtomicInteger; /** * Created by Administrator on 2017/5/17. */ public class CountTest { public static void main(String[] args) { CountThread countThread = new CountThread(); for(int i = 0 ; i < 5 ; i ++){ new Thread(countThread).start(); } } static class CountThread implements Runnable{ private AtomicInteger atomicInteger = new AtomicInteger(0); @Override public void run() { setAtomicValue(atomicInteger.get()+1); } public void setAtomicValue(int newValue){ boolean flag = false; do { int oldValue = atomicInteger.get(); System.out.println("当前线程:"+Thread.currentThread().getName()+",旧的值:"+oldValue+",新的值:"+newValue); flag = atomicInteger.compareAndSet(oldValue, newValue); System.out.println("当前线程:"+Thread.currentThread().getName()+",原子的值设置结果:"+flag); }while (!flag); } } }运行结果
发现红色圈的区域了吧,由于多线程,导致 Thread-3的线程将值设为1的时候失败,原因是0已经被Thread-0的线程设置为1了。所以Thread-3的线程设置失败,最后循环重新取出了最新的值1,然后Thread-3将值继续设置为1,返回true。
相关文章推荐
- 性能测试原理及性能测试实例分析
- Java中对AtomicInteger和int值在多线程下递增操作的测试
- java Atomic compareAndSet部分原理分析
- 性能测试原理及性能测试实例分析
- 通过测试实例详细分析 IoMarkPending 的原理
- JUC源码分析1-原子变量-AtomicInteger/AtomicBoolean/AtomicLong/AtomicReference
- java中的原子操作类AtomicInteger及其实现原理
- Java AtomicInteger源码分析
- java AtomicLong原理解析
- Java JUC之Atomic系列12大类实例讲解和原理分解
- Java JUC之Atomic系列12大类实例讲解和原理分解
- Java Atomic 12大类实例讲解和原理分解
- Java自增原子性问题(测试Volatile、AtomicInteger)
- The Atomic classes in Java 5: AtomicInteger and AtomicLong,AtomicReference etc.
- Java并发-AtomicInteger源码分析
- 通过测试实例详细分析 IoMarkPending 的原理
- Java JUC之Atomic系列12大类实例讲解和原理分解
- 【Java并发编程】深入分析AtomicInteger(二)
- Java之美[从菜鸟到高手演练]之atomic包的原理及分析