当我在线程中创建一个新对象时,该对象是我赋予线程的对象的属性,它在主函数中保持为空(但只是没有 System.out)。我写了一个简单的问题示例,结果相同:
public class T1 {
public T2 t2;
}
public class T2 {
public String s;
/**
* @param args
*/
public static void main(String[] args) {
T1 t1 = new T1();
T3 thread = new T3(t1);
thread.start();
while(t1.t2 == null){
// System.out.println("null");
}
System.exit(0);
}
}
public class T3 extends Thread{
public T1 t1;
public T3(T1 t1){
this.t1 = t1;
}
@Override
public void run(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.t2 = new T2();
while(true){
System.out.println(t1.t2);
}
}
}
所以没有System.out.println("null")
它会导致无限循环,但是当我添加这个 System.out 时,它的行为就像我怀疑的那样。如果我使用静态变量,我什至会得到相同的结果或问题。
是否有某种优化或其他我不明白的东西?或者为什么t1.t2 always == null
没有System.out.println("null")
?我认为 T1 对象及其属性(在本例中为对象 t2)将在堆上创建,它在所有线程之间共享,并且只有 t1 引用变量存储在堆栈中。所以希望有人可以向我解释,为什么它在没有System.out
... 的情况sleep(1000)
下保持 null