现在在 stackoverflow 上已经有了很好的答案,但他们没有给我想要的明确答案。
说你有一个方法
Dosomething();
doAnother();
int x = 5;
Runnable r = new Runnable(){
public void run(){
int y = x;
x = 7;
System.out.println(z);}
}
new Thread(r).start()
现在同时这个方法正在运行,在调用 thread.start 之前,一些全局非易失性变量 z 从 4 更改为 5。
由于 z 发生在 thread.start 之前,程序是否可以保证打印 5?
此外,如果我们以某种方式谈论它,那么可以肯定地说 thread.start() 永远无法重新排序。
就被称为 start on 的线程而言,这意味着直到该点为止的所有内容都是顺序的。例如说我们有
int k = 8;
new Thread(() -> {}).start()
现在......无论是先调用 start 还是将 k 分配 8,从该线程的角度来看都不会产生影响。所以这可以重新排序,但是由于发生在保证之前,这是不可能的吗?
Java 规范并没有说一个强有力的声明。而是说
当一个语句调用 Thread.start() 时,每个与该语句有发生前关系的语句
然而 k = 8 并没有发生在与该陈述的关系之前......
我什至不确定它们是什么意思,除非您使用相同的监视器锁定,否则在与 start 方法的关系之前发生了某些事情
synchronized(this){ int k = 8;}
synchronized(this) { new Thread(() -> {}).start();}
对于一个更可怕的情况,我们有这个代码
Socket con = socket.accept();
Runnable r = new Runnable(){
public void run(){
handleRequest(con)}
}
new Thread(r).start();
然后新线程碰巧发现该 con 为空?
有人可以就这些话题给我一个明确的答案吗?