深入了解Java atomic原子类的使用方法和原理

网友投稿 240 2023-01-03


深入了解Java atomic原子类的使用方法和原理

在讲atomic原子类之前先看一个小例子:

public class UseAtomic {

public static void main(aTeRDpWIString[] 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 unsafaTeRDpWIe = 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);

}

从注释就可以看出:当线程写数据的时候,先对内存中要操作的数据保留一份旧值,真正写的时候,比较当前的值是否和旧值相同,如果相同,则进行写操作。如果不同,说明在此期间值已经被修改过http://,则重新尝试。

compareAndSet使用Unsafe调用native本地方法CAS(CompareAndSet)递增数值。

CAS利用CPU调用底层指令实现。

两种方式:总线加锁或者缓存加锁保证原子性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:常见接口测试工具(常见接口测试工具图片)
下一篇:idea快捷键实现接口(idea接口实现类快捷键)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~