我有一个学生的问题:多核系统中的最终收集线程是否安全?
我想有一个建议和有关问题的能见度在多核一些解释,如果有一个。
我在我的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