gpt4 book ai didi

java - 同步计数器计数不正确

转载 作者:行者123 更新时间:2023-11-30 07:21:17 26 4
gpt4 key购买 nike

对于对象的每次创建,我都希望它可以通过标识符唯一访问。我正在使用一个递增的静态值来跟踪已创建的对象数量,并且每次构造一个新对象时,我都将其标识符设为等于 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 不等。显然,我不希望出现这种不可靠性。 volatile field 能在这里工作吗? (我尝试过相同的结果)我不确定如何确保每个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com