【问题标题】:In java, when variables such as Long, long, Double ,double are autoboxing or unboxing, is reading or writing operation atomic?java中Long、long、Double、double等变量自动装箱或拆箱时,读写操作是原子的吗?
【发布时间】:2016-08-06 08:59:19
【问题描述】:

我知道this

对于引用变量和大多数原始变量(除了 long 和 double 之外的所有类型),读取和写入都是原子的。 对于声明为 volatile 的所有变量(包括 long 和 double 变量),读写都是原子的。

但我想知道 Long、long、Double、double等变量自动装箱或拆箱时,读写操作是原子的吗?

例如:

private Long a;    
private long b;    
private Double c;    
private double d;

a = 2; //is this operation atomic?    
b = a; //is this operation atomic?    
d = 3;    
c = d; //is this operation atomic

【问题讨论】:

    标签: java multithreading atomic jls java-memory-model


    【解决方案1】:

    你说:

    对于引用变量和大多数原始变量(除 long 和 double 之外的所有类型)而言,读取和写入是原子的

    a = 2;
    

    这是对引用变量的写入,所以它是原子的

    b = a;
    

    这相当于

    read a
    call a.longValue()
    assign result to b
    

    所以这会读取一个引用变量(原子),然后从 Long 对象中获取一个不可变的 long 值(因此原子性无关紧要)并写入一个 long 原语(因此不能保证是原子的)

    d = 3;
    

    这写入原始双精度(因此不能保证是原子的)

    c = d;
    

    这相当于

    read d
    call Double.valueOf(value)
    assign result to b
    

    所以这从一个原始的 double 中读取(因此不能保证是原子的),然后将值转换为 Double 并将该引用写入引用变量(原子)

    【讨论】:

    • 如果你引用了一些东西,你应该引用出处。
    • 来源是OP的问题。我认为这很明显。
    • 我不知道我应该引用来源。这是我提到的来源docs.oracle.com/javase/tutorial/essential/concurrency/…
    • @5969bruce 不仅要引用出处,还应使用引用格式指明引文。
    • 这里是 Oracle for Java 8 docs.oracle.com/javase/specs/jls/se8/html/jls-17.html 的更详细解释,具体如下“鼓励 Java 虚拟机的实现尽可能避免拆分 64 位值。鼓励程序员声明共享64 位值作为 volatile 或正确同步其程序以避免可能的并发症。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多