オブジェクトを作成するたびに、識別子によって一意にアクセスできるようにしたいと考えています。増分静的値を使用して、作成されたオブジェクトの数を追跡し、新しいオブジェクトが構築されるたびに、その識別子を count + 1 と同等にします (そしてカウントをインクリメントします)。私が直面している問題は、同期が機能していないことです。コードの簡略版は次のとおりです。
public static final Hashtable MODULES = new Hashtable();
private static final Object countLock = new Object();
private static int count = 0;
private final String identifier;
private final String name;
public Class(String name) {
this.identifier = String.valueOf(incrementCount());
this.name = name;
MODULES.put(identifier, name);
}
private static int incrementCount() {
synchronized (countLock) {
return ++count;
}
}
これでテストすると(非現実的ですが、確かに、動作することを確認するために):
for (int x = 0; x < 100; x++) {
new Thread(new Runnable() {
@Override
public void run() {
Class m = new Class("Name");
}
}).start();
}
System.out.println(Module.MODULES.size());
60 年代から 100 年代までの出力が得られます。明らかに、この種の信頼性の低さは望ましくありません。揮発性フィールドはここで機能しますか? class
(私は同じ結果を試しました)すべてのオブジェクトが異なる識別子を持っていることを確認する方法がわかりません。どんな解決策でも大歓迎です。
注: 実装固有の理由により、java.util.concurrent にはアクセスしません。