Java关键字volatile修饰变量

  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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值