在Java中从构造函数调用抽象方法可以吗?
假设我有一个实现可运行接口的抽象基类
public abstract class Base implements Runnable {
protected int param;
public Base(final int param) {
System.out.println("Base constructor");
this.param = param;
// I'm using this param here
new Thread(this).start();
System.out.println("Derivative thread created with param " + param);
}
@Override
abstract public void run();
}
这是几个衍生类中的一个
public class Derivative extends Base {
public Derivative(final int param) {
super(param);
}
@Override
public void run() {
System.out.println("Derivative is running with param " + param);
}
public static void main(String[] args) {
Derivative thread = new Derivative(1);
}
}
重点是我希望我的基类做一些一般的事情,而不是每次都复制它。 实际上,它运行正常,输出总是一样的:
基本构造函数 使用参数1创建的派生线程 导数正在使用参数1运行
但在JAVA中,启动一个线程调用构造函数中的抽象方法安全吗?因为C++和C语言在大多数情况下都是不安全的,据我所知。 谢谢!
# 1 楼答案
将
this
从构造函数中传递出去被称为“让this
从构造函数中逃逸”,可能会导致一些特别讨厌和奇怪的错误,因为对象可能处于不一致的状态当
this
被传递给另一个线程时尤其如此,如本例所示。由于JVM有权对线程中的语句进行重新排序,因此可能会出现未定义的行为/状态