gpt4 book ai didi

java - 为什么将 "this"传递给 Thread 构造函数不安全?

转载 作者:行者123 更新时间:2023-12-01 17:13:20 25 4
gpt4 key购买 nike

为什么将“this”传递给 Thread 构造函数是一种不安全的构造技术?如果是的话,还有什么选择呢?它与测试或调试有关吗?我找到了一些答案,但没有完全明白。

class NewThread implements Runnable {
Thread t;
NewThread(){
t = new Thread(this,"My new Thread");
}
}

最佳答案

this 传递给线程构造函数没有任何问题。我怀疑您所指的是将 this 传递给线程构造函数,在您自己的构造函数中

class MyClass implements Runnable {
private final Integer value;

MyClass() {
new Thread(this);
int i = 0;
value = Integer.valueOf(20 / i);
}

@Override
public void run() {
System.out.println(value.intValue());
}
}

一般来说,从构造函数中“泄漏”this 引用是一个坏主意,因为如果构造函数抛出异常,则对象可能会处于不一致的状态。

更具体地说,在构造函数中使用 this 启动线程是一个坏主意,因为该线程可能会在您完成对象构造之前开始运行。因此,即使上面的 i 为 1,run() 仍可能抛出异常,因为它可能发生在分配 value 之前。

在某些情况下,您可以通过在构造函数的最后一行创建线程来解决这个问题。但这并不是万无一失的,因为该构造函数可能会被父类(super class)调用。更好的解决方案是:

class MyClass implements Runnable {
...
MyClass start() {
new Thread(this);
return this;
}
...
}

// Then construct like this:
MyClass foo = new MyClass().start();

关于java - 为什么将 "this"传递给 Thread 构造函数不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23022242/

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