我有一個學生的問題:多核系統中的最終收集線程是否安全?
我想有一個建議和有關問題的能見度在多核一些解釋,如果有一個。
我在我的SpringBoot應用程序中使用註冊表模式將不同的掃描器實例映射到它們的名稱。
配置:
@Bean
public WebScannerExecutor webScannerExecutor(final WebScannerClientProcessor webScannerClientProcessor) {
return new WebScannerExecutor(webScannerClientProcessor);
}
@Bean
public TLSScannerExecutor tlsScannerExecutor(final @Value("${tls.scanner.path}") String path, final BashProcessor bashProcessor) {
return new TLSScannerExecutor(path, bashProcessor);
}
@Bean
public ScanExecuterRegistry executerRegistry(final WebScannerExecutor webScannerExecutor, final TLSScannerExecutor tlsScannerExecutor) {
final ScanExecuter[] arr = new ScanExecuter[] {webScannerExecutor, tlsScannerExecutor};
return new ScanExecuterRegistry(arr);
}
註冊地:
public class ScanExecuterRegistry {
private final ImmutableMap<ScannerType, ScanExecuter> registry;
public ScanExecuterRegistry(final ScanExecuter... executors) {
this.registry = ImmutableMap.<ScannerType, ScanExecuter> builder().putAll(Arrays.asList(executors).stream().collect(Collectors.toMap(ScanExecuter::getType, e -> e))).build();
}
現在我用番石榴ImmutableMap和我敢肯定是沒有問題的。但是......
private final Map<ScannerType, ScanExecuter> registry;
如果我走的,而不是ImmutableMap只是一個最後的映射(不可變的引用而不是內容),可以在任何問題上升?多線程系統中的線程緩存,可視性等問題(即使使用singelton)?
編輯:
所有隻要你不修改的內容
沒錯,我想獲得良好的解釋。我對Java內存模型還不太瞭解。
我可以改變地圖的內容,只在spring配置類中添加一個新的掃描器。所以應用程序將在任何情況下重新啓動。還會有問題嗎?
一切都很好,只要你不修改內容,比較http://stackoverflow.com/questions/6457109/java-concurrency-is-final-field-initialized-in-constructor-thread-safe – zapl