我有以下代码:-
class ThreadB extends Thread {
int total;
@Override public void run() {
synchronized (this){
for(int i=0; i<5; i++){
total+=i;
}
}
}
}
public class Solution {
public static void main(String[] args) throws InterruptedException {
ThreadB b = new ThreadB();
b.start();
synchronized (b){
b.wait();
}
System.out.println(b.total);
}
}每当我运行它时,输出都是10。如果我注释等待行,则输出始终为0。
我很困惑为什么我总是得到10的答案。有两个线程,ThreadB和主线程,所以当我执行等待方法时,ThreadB应该按照定义等待,不应该添加值,因此0应该由主线程打印?
发布于 2022-02-28 01:03:01
我很困惑为什么我总是得到10的答案。有两个线程,ThreadB和主线程,所以当我执行等待方法时,ThreadB应该按照定义等待,不应该添加值,因此0应该由主线程打印?
由于Java线程终止的方式,您得到了一个结果。当Thread完成时,会通知Thread对象本身。因此,wait()方法会导致线程等待后台线程的终止。join()方法是通过调用wait()实现的,您应该直接使用join()而不是wait()。
如果对等待行进行注释,则输出始终为0。
如果您没有wait()行,那么主线程很可能会在b线程启动之前完成并得到b的值。启动线程需要一些时间,您需要使用b.join()来确保等待b线程完成,并与其他线程所做的任何内存更改同步,在本例中为b.total。
如果您放置一个睡眠而不是等待,那么即使0线程已经将其设置为10,您仍然可能会看到它的值,因为没有同步内存的东西,并且可能缓存0的b.total值。join()方法等待线程完成并同步内存,以便您能够看到线程的结果。
https://stackoverflow.com/questions/71247244
复制相似问题