在讲atomic原子类之前先看一个小例子:
<span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">UseAtomic {
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-keyword">void <span class="hljs-title">main<span class="hljs-params">(String[] args) {
AtomicInteger atomicInteger=<span class="hljs-keyword">new AtomicInteger();
<span class="hljs-keyword">for(<span class="hljs-keyword">int i=<span class="hljs-number">0;i<<span class="hljs-number">10;i++){
Thread t=<span class="hljs-keyword">new Thread(<span class="hljs-keyword">new AtomicTest(atomicInteger));
t.start();
<span class="hljs-keyword">try {
t.join(<span class="hljs-number">0);
} <span class="hljs-keyword">catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(atomicInteger.get());
}
}
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AtomicTest <span class="hljs-keyword">implements <span class="hljs-title">Runnable{
AtomicInteger atomicInteger;
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-title">AtomicTest<span class="hljs-params">(AtomicInteger atomicInteger){
<span class="hljs-keyword">this.atomicInteger=atomicInteger;
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
最终的输出结果为100,可见这个程序是线程安全的。如果把AtomicInteger换成变量i的话,那最终结果就不确定了。
打开AtomicInteger的源码可以看到:
<span class="hljs-keyword">private <span class="hljs-keyword">volatile <span class="hljs-keyword">int value;
</span></span></span>
volatile关键字用来保证内存的可见性(但不能保证线程安全性),线程读的时候直接去主内存读,写操作完成的时候立即把数据刷新到主内存当中。
从注释就可以看出:当线程写数据的时候,先对内存中要操作的数据保留一份旧值,真正写的时候,比较当前的值是否和旧值相同,如果相同,则进行写操作。如果不同,说明在此期间值已经被修改过,则重新尝试。
compareAndSet使用Unsafe调用native本地方法CAS(CompareAndSet)递增数值。
CAS利用CPU调用底层指令实现。
两种方式:总线加锁或者缓存加锁保证原子性。
Original: https://www.cnblogs.com/panxuejun/p/10200585.html
Author: THISISPAN
Title: (转)Java atomic原子类的使用方法和原理(一)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536631/
转载文章受原作者版权保护。转载请注明原作者出处!