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

标签 java synchronization counter

对于对象的每次创建,我希望它可以通过标识符进行唯一访问。我使用递增静态值来跟踪已创建的对象数量,并且每次构造新对象时,我都会使其标识符等于 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/

相关文章:

php - 数据同步如何工作以及如何在服务器-客户端应用程序中使用它?

synchronization - 如果服务器上的文件不同,rsync 是否会忽略文件时间戳并自动覆盖客户端?

python - 如何提高 Python 中查找最常见字符串的性能?

linux - 批量更改目录中的文件名 - Shell

Java:如何将文本文件中的所有单词保存在字符串数组上

用于询问 XSD 文件的 Java 方法

java - Spring boot 限制 Controller 中特定API的并发调用数

ios - 实时同步

java - 如何避免在返回然后单击“下一步”时添加小部件?

java - Web 服务响应包含无效的 XML 字符