Java关键字volatile修饰变量

来源:互联网 发布:淘宝店铺改名怎么改 编辑:程序博客网 时间:2024/05/21 07:59

  volatile关键字的作用是告诉编译器,凡是被该关键字申明的变量都是易变的、不稳定的,所以不要试图对该变量使用缓存等优化机制,而应当每次都从他的内存地址中去读取值,但volatile并不是每次更改完就要立刻将他写回内存,volatile只提供了内存的可见性,并不提供原子性(与锁机制的区别:锁机制即提供了内存的可见性又提供了原子性)。
  使用volatile标记的变量在读取或写入时不需要使用锁,这将减少产生死锁的概率。


原子操作:atomic
atomic是不会阻塞线程,线程安全的加强版的volatile原子操作。
这里写图片描述


以其中的AtomicInteger来说明:
AtomicInteger主要的方法有:
get() 获取当前值。
getAndSet(int newValue) 以原子方式设置为给定值,并返回旧值。
getAndDecrement() 以原子方式将当前值减 1。
getAndIncrement() 以原子方式将当前值加 1。
getAndAdd(int delta) 以原子方式将给定值与当前值相加。

public class AtomicIntegerDemo {    public static void main(String[] args) {        AtomicInteger atomicInteger=new AtomicInteger();        System.out.println(atomicInteger.get());        System.out.println(atomicInteger.getAndSet(1));        System.out.println(atomicInteger.getAndSet(2));        System.out.println(atomicInteger.getAndIncrement());        System.out.println(atomicInteger.getAndDecrement());        System.out.println(atomicInteger.getAndAdd(5));        System.out.println(atomicInteger.get());    }}

这里写图片描述
原子操作的实现原理
是利用CPU进行交换比较(即CAS:Compare and Swap)和非阻塞式算法(nonblocking algorithms);查看AtomicInteger源码会发现有些是通过调用JNI的代码实现的。JNI(Java Native Interface)为JAVA的本地调用,允许java调用其它语言,而Compare and Swap就是借助C来调用CPU底层指令实现的。

0 0
原创粉丝点击