Java安全发布在构造函数中,避免泄漏"这个"参考

时间:2017-08-08 23:13:58

标签: java multithreading concurrency thread-safety

对于下面的代码是否完全是线程安全的并且不会泄漏"这个"我将不胜感激。参考?我尝试做的主要是使用ExecutorService在后台线程中引导/初始化另一个服务。

我只是稍担心,因为我从某个地方读到,从构造函数启动一个线程是不好的做法,因为它会泄漏"这个"在完全构造类之前的引用。

public class MyService {

private final ExecutorService executorService;
private volatile AnotherService anotherService;
private volatile boolean isReady = false;


public MyService(final ExecutorService executorService) {
    this.executorService = executorService;
    start();
}

private void start() {
    executorService.submit(new Runnable() {
        @Override
        public void run() {
            try {
                anotherService = init();
                isReady = true;
            } catch (Exception e) {
                // do nothing, just retry later
            }
        }
    });
}

private AnotherService init() {
    // some code to initialize
    return AnotherServiceBootstrap.getInstance().bootstrap();
}

// some other methods in class

}

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

我认为您的代码没有任何风险 -

  1. 请参阅this question
  2. 鉴于该帖子中的解释,您唯一的风险是,如果有人在构造函数退出之前可以访问唯一的最终成员(executorService)。但是,以这种方式访问​​变量的唯一位置是您正在创建并提交给执行程序服务的线程。在运行submit()方法之前,您会获得一个先发生的保证,它表示构造函数到目前为止所做的所有更改都发生在提交的线程运行之前。所以我相信你被覆盖了。