本文介紹了Spring,實例變量在新線程中的可見性從@PostConstruct開始的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在下面的情況下,Spring是否保證‘sleepInterval’和‘Business Logic’實例變量的可見性?
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
}
}
}
}
我認為應該存在可見性問題。但我無法復制它。
推薦答案
不會有可見性問題。Java內存模型保證在調用Thread.start之前一個線程中完成的所有操作(或由于發生之前的關系而可見)都將被啟動的線程看到:
來自the JLS section 17.4.5中的規范:
對線程調用Start()發生在啟動的線程中的任何操作之前。
這篇關于Spring,實例變量在新線程中的可見性從@PostConstruct開始的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,