这段代码线程在Spring PostConstruct中安全吗

时间:2019-03-29 05:12:33

标签: multithreading spring-boot postconstruct

我已经对这两个类做了一些测试。有人可以帮忙确定这两个类是否是线程安全的吗?有人可以帮助确定是否不使用并发HashMap,但是使用HashMap会导致任何并发问题。如何使它更加线程安全?用并行测试对其进行测试的最佳方法是什么?

我仅使用Hashmap对其进行了测试,并且效果很好。但是,我的测试规模为20分钟左右,持续2分钟。 谁能建议我是否应该提高请求率并重试,还是可以指出需要修复的地方。

@Component 公共类TestLonggersImpl     实现TestSLongger {

@Autowired
YamlReader yamlReader;

@Autowired
TestSCatalog gSCatalog;

@Autowired
ApplicationContext applicationContext;

private static HashMap<String, TestLonggerImpl> gImplHashMap = new HashMap<>();

private static final Longger LONGER = LonggerFactory.getLongger(AbstractSLongger.class);

@PostConstruct
public void init() {
    final String[] sts = yamlReader.getTestStreamNames();
    for (String st : sts) {
        System.out.println(st);
        LONGER.info(st);
    }
    HashMap<String, BSCatalog> statsCatalogHashMap = gSCatalog.getCatalogHashMap();
    for (Map.Entry<String, BSCatalog> entry : statsCatalogHashMap.entrySet()) {

        BSCatalog bCatalog = statsCatalogHashMap.get(entry.getKey());
        //Issue on creating the basicCategory
        SProperties sProperties = yamlReader.getTestMap().get(entry.getKey());
        Category category = new BasicCategory(sProperties.getSDefinitions(),
            bCatalog.getVersion(),
            bCatalog.getDescription(), new HashSet<>());

        final int version = statsCatalogHashMap.get(entry.getKey()).getVersion();
        getTestImplHashMap().put(entry.getKey(),
            applicationContext.getBean(TestLonggerImpl.class, category,
                entry.getKey(),
                version));
    }
}

@Override
public void logMessage(String st, String message) {
    if (getTestImplHashMap() != null && getTestImplHashMap().get(st) != null) {
        getTestImplHashMap().get(st).log(message);
    }
}

@VisibleForTesting
static HashMap<String, TestLonggerImpl> getTestImplHashMap() {
    return gImplHashMap;
}

}

***二等舱

@Component 公共类GStatsCatalog {

@Autowired
YamlReader yamlReader;

private static HashMap<String, BStatsCatalog> stCatalogHashMap = new HashMap<>();

@PostConstruct
public void init() {
    String[] streams = yamlReader.getGSNames();

    for (String stream : streams) {
        BStatsCatalog bCatalog = new BStatsCatalog();
        SProperties streamProperties = yamlReader.getGMap().get(stream);
        bCatalog.setSName(stream);
        int version = VERSION;
        try {
            version = Integer.parseInt(streamProperties.getVersion());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        bCatalog.setVersion(version);
        bCatalog.setDescription(streamProperties.getDescription());
        stCatalogHashMap.put(stream, bCatalog);
    }
}

public static HashMap<String, BStatsCatalog> getCatalogHashMap() {
    return stCatalogHashMap;
}

public void setYamlReader(YamlReader yamlReader) {
    this.yamlReader = yamlReader;
}

}

1 个答案:

答案 0 :(得分:1)

我认为@postconstruct下的方法是线程安全的。它在整个生命周期中创建的bean之后仅运行一次。