对于对象的每次创建,我希望它可以通过标识符进行唯一访问。我使用递增静态值来跟踪已创建的对象数量,并且每次构造新对象时,我都会使其标识符等于 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。
最佳答案
您的锁工作正常,但问题有所不同。您正在通过一个新的Thread
初始化每个对象。 当线程在后台运行时,主线程会立即打印计数。在两者之间放置适当的延迟,您将看到正确的计数。
public static void main(String[] args) throws InterruptedException{
for (int x = 0; x < 100; x++) {
new Thread(new Runnable() {
@Override
public void run() {
Counter m = new Counter("Name");
}
}).start();
}
Thread.sleep(1000);//put a delay
System.out.println(MODULES.size());
}
关于java - 同步计数器计数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13447664/