gpt4 book ai didi

java - Java中变量赋值的可见性

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:34 24 4
gpt4 key购买 nike

我最近和一个 friend 争论这样的代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* See memory consistency effects in a Java Executor.
*/
public class PrivateFieldInEnclosing {
private long value;
PrivateFieldInEnclosing() {}
void execute() {
value = initializeValue();
ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(new Y());
}

class Y implements Runnable {
@Override
public void run() {
System.out.println(value);
}
}

private long initializeValue() {
return 20;
}

public static void main(String[] args) {
new PrivateFieldInEnclosing().execute();
}
}

我认为 value 有可能在 Y 中被视为 0,因为不能保证赋值 value = initializeValue() 在执行者的线程中是可见的。我说他需要让 value 成为一个可变字段。

他反驳我,说因为是私有(private)实例字段,在线程创建前赋值,那么这个值是可见的。

我调查了 https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4但我无法确定我究竟可以用什么来支持我的陈述。谁能帮我?谢谢!

最佳答案

私密与否无关紧要。相关的是:

Memory consistency effects: Actions in a thread prior to submitting a Runnable object to an Executor happen-before its execution begins, perhaps in another thread.

来自 Executor docs .这意味着无论您在调用 submit 之前做什么,在 runnable 中都是可见的。您甚至可以在构造执行器之后执行此操作,在这种特殊情况下,执行线程实际启动的时间并不重要,因为 submit 方法本身提供了非常强大的保证。

这是使 java.util.concurrent 包非常有用的特性之一。

关于java - Java中变量赋值的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35683034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com