• JAVA中的volatile关键字


    JAVA提供了volatile关键字,用于修饰变量。

    1.保证变量对所有线程的可见性
    当一个线程修改了变量的值,会强制同步到内存,这样其它线程能够立即读取它的值。
    2.禁止指令重排
    通过插入内存屏障禁止CPU重新排序指令。

    volatile翻译为:不稳定的、易变的;
    含义可以理解为:变量的值可能随时会别的线程修改,保证其它线程能读取到修改后的值。

    volatile能具备可见性、有序性,但不具备原子性。

    适用场景:
    线程循环标志位变量;
    单例模式中的实例变量;
    读多写少,写操作不依赖当前值。

    JDK中应用:
    ConcurrentHashMap的Entry的value和next被声明为volatile;
    AtomicLong中的value被声明为volatile。

    对比synchronized关键字:
    volatile不具体原子性,因此不能保证多线程读写数据时数据的一致性;
    但它不阻塞线程,性能高于synchronized。


    JAVA内存模型

    内存、CPU缓存

    当对非volatile变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存;
    如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着变量可能拷贝到不同的CPU缓存;

    1.可见性

    指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。

    2.原子性

    指操作的最小单位,是不可分割的。
    例:
    原子性操作 a=0;
    非原子性 a++;

    3.有序性

    指令是按顺序串行执行的。
    程序执行时按照代码书写的先后顺序执行;
    在Java内存模型中,允许编译器和处理器对指令进行重排序;
    重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

  • 相关阅读:
    数据表管理admin
    HDU 5057
    HDU 5056
    HDU 6035(树形dp)
    CodeForces 586D
    Codeforces 940D
    CodeForces 820C
    TOJ4114(活用树状数组)
    2017CCPC中南地区赛 H题(最长路)
    CodeForces 544C (Writing Code)(dp,完全背包)
  • 原文地址:https://www.cnblogs.com/cdfive2018/p/10361361.html
Copyright © 2020-2023  润新知