0

このクラスはシングルトンです。私はスレッドセーフがあまり得意ではありません。このクラスはスレッドセーフですか? 一部のメソッドは省略されていますが、1 つのスレッドからのみ使用されます。ただし、ここにリストされているメソッドは、複数のスレッドから同時にアクセスされます。

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;
    }

}
4

5 に答える 5

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;
}

メソッドrankとメソッドrankSubtractionByCountsPerDayは純粋な関数であるため、定義上スレッドセーフです。現在、setFactorForTermNameMapping共有状態には依存せず、揮発性変数にのみ書き込むため、その操作はアトミックです。

表示されていないメソッドがマップを読み取るだけで、factorForTermName 一度だけにアクセスするように慎重に記述されている場合、クラス全体はおそらくスレッドセーフです。

于 2013-08-06T10:34:41.720 に答える