に同期これでapacheの飼育係からのメソッドのソースコード、クラスのDatatreeJavaはローカル変数イラスト
/**
* update the count of this stat datanode
*
* @param lastPrefix
* the path of the node that is quotaed.
* @param diff
* the diff to be added to the count
*/
public void updateCount(String lastPrefix, int diff) {
String statNode = Quotas.statPath(lastPrefix);
DataNode node = nodes.get(statNode);
StatsTrack updatedStat = null;
if (node == null) {
// should not happen
LOG.error("Missing count node for stat " + statNode);
return;
}
synchronized (node) {
updatedStat = new StatsTrack(new String(node.data));
updatedStat.setCount(updatedStat.getCount() + diff);
node.data = updatedStat.toString().getBytes();
}
// now check if the counts match the quota
String quotaNode = Quotas.quotaPath(lastPrefix);
node = nodes.get(quotaNode);
StatsTrack thisStats = null;
if (node == null) {
// should not happen
LOG.error("Missing count node for quota " + quotaNode);
return;
}
...それはノードのオブジェクトに同期化する理由
私の質問はありますか?他のスレッドがHashMapであるノードからノードを削除すると、ノードは無効になります。ここに問題はありますか?
「node.data」をアトミックに更新したいからです。 2つのスレッドがこのクリティカルセクションを一緒にヒットした場合、統計は間違っている可能性があります。 –