java - 我可以假设 'no data race' 在 Java 中的用户线程和终结线程之间

标签 java multithreading race-condition finalize

考虑以下 Java 类:

class X {
    public void foo() {
        bar = 1;
    }

    protected void finalize() {
        if (bar == 1)
            baz();
    }

    private int bar = 0;
}

假设 X.foo() 永远不会从任何 finalize() 方法(直接或间接)调用,我可以确定上面的代码是没有数据争用,也就是说,我能否确定 X.finalize() 的每种情况下都能看到 X.foo() 写入的值X.foo()实际上被调用了吗?

天真的分析会说 X.finalize() 不能与 X.foo() 同时运行(由于提到的假设),所以没有额外的同步必要的。

我猜想上面的代码没有数据竞争,但令我困扰的是语言规范在 §17.4.5 中包含以下显式声明,但没有提及 finalize() 和一般方法之间的先行关系:

There is a happens-before edge from the end of a constructor of an object to the start of a finalizer (§12.6) for that object.

编辑:我认为有必要使我的问题更精确,所以这里尝试对问题进行精确的重新表述:

如果我保证,Java 是否保证特定方法 X.foo()X.finalize() 之间存在happens-before 关系X.foo() 从未被任何finalize() 方法调用(直接或间接)?此处,happens-before 的解释与 §17.4.5 中的定义完全相同。 .

最佳答案

由于每个线程都有一个变量缓存,所以它不是线程安全的,在其他作品中每个线程都有自己的变量 View 。您可以将 volatine 应用于变量以强制线程加载变量。如果从 synchronized block

访问变量,同样有效

-> When does java thread cache refresh happens?

关于java - 我可以假设 'no data race' 在 Java 中的用户线程和终结线程之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544677/

相关文章:

multithreading - 嵌套循环中的并行代码

java - 监视阻塞操作

java - 在下面的程序中检测和处理竞争条件

java - 仅当确切实体不存在时才保存实体

java - 如何将随机数从Java类传递到html文件

java - 我如何告诉 nifty GUI 我的字体文件在哪里?

javascript - react 切换列表竞争条件?

java - 在 Java 中,我如何使用这个 countLines 方法来计算没有换行符的行?

java - 跨多个线程的可变静态变量

java - 死锁和资源排序