首页 > 解决方案 > 最终字段语义

问题描述

17.5。final 字段语义

例 17.5-1。Java 内存模型中的 final 字段

class FinalFieldExample { 
    final int x;
    int y; 
    static FinalFieldExample f;

    public FinalFieldExample() {
        x = 3; 
        y = 4; 
    } 

    static void writer() {
        f = new FinalFieldExample();
    } 

    static void reader() {
        if (f != null) {
            int i = f.x;  // guaranteed to see 3  
            int j = f.y;  // could see 0
        } 
    } 
}

我被这个问题困扰了好几天。

谁能直接回答我为什么 fy 可以看到 0?

标签: javajvm

解决方案


如果线程 A 分配y

Thread A:
   writer();

和线程 B 读取y

Thread B
   reader();

然后y在没有任何同步的情况下被读取,因此可能看不到分配的值。它是 Java 同步要求的一个简单应用。如果您仍然不明白,请在您的问题中澄清。

换句话说,如果y被声明为volatilethen 就可以保证被看到。

class FinalFieldExample { 
    final int x;
    volatile int y; 

然后:

static void reader() {
    if (f != null) {
        int i = f.x;  // guaranteed to see 3  
        int j = f.y;  // guaranteed to see 4

推荐阅读