这个类是线程安全的吗?

0 java collections thread-safety getter-setter

这个班是一个单身人士.我不太擅长线程安全.这个类是线程安全的吗?省略了一些方法,但它们仅用于一个线程.这里列出的方法将同时从多个线程访问.

public class TermsDto {

    private final static MapSplitter mapSplitter = Splitter
            .on(',').trimResults().omitEmptyStrings()
            .withKeyValueSeparator(":");

    private volatile double factorForOthers = 4;

    private volatile Map<String, Double> factorForTermName = 
            new HashMap<String, Double>();

    public void setFactorForOthers(double factorForOthers) {
        this.factorForOthers = factorForOthers;
    }

    public void setFactorForTermNameMapping(String mapping) {
        HashMap<String, Double> tempFactorForTermName = 
                new HashMap<String, Double>();
        for (Map.Entry<String, String> entry : 
                 mapSplitter.split(mapping).entrySet()) {
            double factor = Double.parseDouble(entry.getValue());
            tempFactorForTermName.put(entry.getKey(), factor);
        }
        factorForTermName = tempFactorForTermName;
    }

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 5

在您显示的所有代码中,只有这些是相关部分:

private volatile double factorForOthers = 4;

private volatile Map<String, Double> factorForTermName = 
        new HashMap<String, Double>();

public void setFactorForOthers(double factorForOthers) {
    this.factorForOthers = factorForOthers;
}

public void setFactorForTermNameMapping(String mapping) {
    HashMap<String, Double> tempFactorForTermName = 
            new HashMap<String, Double>();
    for (Map.Entry<String, String> entry : 
             mapSplitter.split(mapping).entrySet()) {
        double factor = Double.parseDouble(entry.getValue());
        tempFactorForTermName.put(entry.getKey(), factor);
    }
    factorForTermName = tempFactorForTermName;
}
Run Code Online (Sandbox Code Playgroud)

方法rankrankSubtractionByCountsPerDay纯函数,因此根据定义是线程安全的.现在,由于您setFactorForTermNameMapping不依赖于任何共享状态,而只是写入volatile变量,因此它的操作是原子的.

如果你没有显示的方法只读取地图,并且仔细编写factorForTermName 访问一次,那么整个类可能是线程安全的.