Spring,新线程中的实例变量可见性从@PostConstruct开始

时间:2018-04-09 22:44:40

标签: java spring concurrency visibility postconstruct

在下面的情况下,spring是否保证'sleepInterval'和'businessLogic'实例变量的可见性?

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class SomeService implements Runnable {

  @Value("${sleepInterval}")
  private Long sleepInterval;

  @Autowired
  private BusinessLogicService businessLogic;

  @PostConstruct
  public void postConstruct() {
      new Thread(this).start();
  }

  @Override
  public void run() {
      while (true) {
          try {
              Thread.sleep(sleepInterval);

              businessLogic.doSomeBusinessLogic();

          } catch (InterruptedException e) {
              //handle error
          }
      }
  }
}

我认为应该存在可见性问题。但我无法重现它。

1 个答案:

答案 0 :(得分:1)

不存在可见性问题。 Java内存模型保证在调用Thread.start之前在一个线程中完成(或由于先前发生的关系而可见)将被启动的线程看到:

来自the JLS section 17.4.5中的规范:

  

在启动线程中的任何操作之前,对线程的start()调用发生。