相关疑难解决方法(0)

Java:从最终字段可到达的对象的最终字段冻结

标题为" Core Java Concurrency "的DZone refcard 声明:

设置后,无法更改最终字段值.将对象引用字段标记为final不会阻止从该字段引用的对象稍后更改.例如,最终的ArrayList字段不能更改为不同的ArrayList,但可以在列表实例上添加或删除对象.

最终字段冻结不仅包括对象中的最终字段,还包括从这些最终字段可到达的所有对象.

我对第二个陈述并不完全清楚.这是否意味着如果我在A类类型的A类中有一个final字段,而后者又有一个Integer类型的最终字段,那么A类实例的最终字段冻结只有在最后一个字段冻结b.c已经发生之后才会完成?

public class A{

  public final B b = new B();

}

public class B{ 

  public final Integer c = 10;

}
Run Code Online (Sandbox Code Playgroud)

java concurrency

11
推荐指数
2
解决办法
2758
查看次数

在 volatile 环境下分析 JIT 生成的 x86 输出

我写这篇文章是为了深入理解 Java 中的 volatile

public class Main {
    private int x;
    private volatile int g;


    public void actor1(){
       x = 1;
       g = 1;
    }


    public void actor2(){
       put_on_screen_without_sync(g);
       put_on_screen_without_sync(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在分析 JIT 为上述代码生成的内容。从我们在上一篇文章中的讨论中我们知道输出1, 0是不可能的,因为:


写挥发v的原因,每一个动作a前述v原因,那a之前是可见的(将被刷新到内存)v将是可见的。


   .................(I removed not important body of method).....

  0x00007f42307d9d5e: c7460c01000000     (1) mov       dword ptr [rsi+0ch],1h
                                                ;*putfield x
                                                ; - package.Main::actor1@2 (line 14)

  0x00007f42307d9d65: bf01000000          (2) mov       edi,1h
  0x00007f42307d9d6a: 897e10              (3) mov …
Run Code Online (Sandbox Code Playgroud)

java jvm volatile memory-barriers

2
推荐指数
1
解决办法
278
查看次数

标签 统计

java ×2

concurrency ×1

jvm ×1

memory-barriers ×1

volatile ×1