我最近和一位朋友就这样的代码争论过:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为,这是可能的,value可以为可见0的Y,因为有不能保证分配value = initializeValue()是在执行程序的线程是可见的.我说他需要做value …