深入了解Java atomic原子类的使用方法和原理
2019-06-25 11:09
288 查看
在讲atomic原子类之前先看一个小例子:
public class UseAtomic { public static void main(String[] args) { AtomicInteger atomicInteger=new AtomicInteger(); for(int i=0;i<10;i++){ Thread t=new Thread(new AtomicTest(atomicInteger)); t.start(); try { t.join(0); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(atomicInteger.get()); } } class AtomicTest implements Runnable{ AtomicInteger atomicInteger; public AtomicTest(AtomicInteger atomicInteger){ this.atomicInteger=atomicInteger; } @Override public void run() { atomicInteger.addAndGet(1); atomicInteger.addAndGet(2); atomicInteger.addAndGet(3); atomicInteger.addAndGet(4); } }
最终的输出结果为100,可见这个程序是线程安全的。如果把AtomicInteger换成变量i的话,那最终结果就不确定了。
打开AtomicInteger的源码可以看到:
// setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private volatile int value;
volatile关键字用来保证内存的可见性(但不能保证线程安全性),线程读的时候直接去主内存读,写操作完成的时候立即把数据刷新到主内存当中。
CAS简要
/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * * @param expect the expected value * @param update the new value * @return {@code true} if successful. False return indicates that * the actual value was not equal to the expected value. */ public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
从注释就可以看出:当线程写数据的时候,先对内存中要操作的数据保留一份旧值,真正写的时候,比较当前的值是否和旧值相同,如果相同,则进行写操作。如果不同,说明在此期间值已经被修改过,则重新尝试。
compareAndSet使用Unsafe调用native本地方法CAS(CompareAndSet)递增数值。
CAS利用CPU调用底层指令实现。
两种方式:总线加锁或者缓存加锁保证原子性。
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- (转)Java atomic原子类的使用方法和原理(一)
- 深入了解java Lombok的使用方法
- 深入了解JavaScript中的Symbol的使用方法
- 深入了解android平台的jni的原理以及本地多线程调用java代码
- 对Java方法内部使用this访问成员变量的深入理解
- 深入了解Python中pop和remove的使用方法
- 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)
- 深入了解LINUX下IO模式(四)——JAVA中使用epoll
- java 深入了解DTO及如何使用DTO
- 简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码。
- 【java回调】同步/异步回调机制的原理和使用方法
- 深入分析 Java 方法反射的实现原理
- 教你深入了解Java中接口的使用
- java 深入了解DTO及如何使用DTO
- java 深入了解DTO及如何使用DTO
- 【转载】深入了解C语言(函数的参数传递和函数使用参数的方法)
- java中的构造方法的深入了解
- 深入了解JavaScript中的Symbol的使用方法
- java线程中join方法原理,以及守护线程的使用
- 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)