java - ArrayList,检查 2 个线程的大小

标签 java multithreading arraylist copyonwritearraylist

我有一个 list :

ArrayList 列表 = new ArrayList<>();

在第一个线程中,我添加元素(速度很快 - 30/秒) 在第二个线程上,我读取其大小并打印到文件。

第一个线程:

synchronized(list){
    list.add(PlayerPosition);
}

第二个线程:

synchronized(list){
if(list.size()>0)
    out.print(list.size() + " ");
}

是文件的输出,只是一部分: 1 1 1 3 3 5 4 6 7 7 9 11 8 9 12 10 14 16

这是错误的,因为它只会增加。可以是 1 1 1,但不能是 11 8。

我的程序很大,但这些只是这个列表中的出现(我已经删除了一半的代码来调试它)。整个应用程序中没有 list.remove() 等。

我有一个问题:这可能吗?它的行为像这样吗? 否则的话 - 这是我代码中某个地方的错误。

是的,我尝试过使用 CopyOnWriteArrayList - 同样的事情。 谢谢!

最佳答案

print 可能没有按照您期望的顺序执行。将第二个线程的代码更改为以下内容:

synchronized(list){
    if (list.size() > 0) {
        synchronized (out) {
            out.print(list.size() + " ");
            out.flush();
        }
    }
}

您的OutputStream正在将字符写入终端(或文件,或其他东西)。如果没有同步 out 和刷新,当线程 2 告诉 OutputStream 打印时,之前的打印可能还没有完成。同步和刷新会强制线程 2 等待所有字符实际写入终端后再继续。

关于java - ArrayList,检查 2 个线程的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501205/

相关文章:

java - 这段代码有什么问题? Netbeans 不编译代码

django - Django 运行多线程或多进程吗?

java - 生成排列的更快方法

java - 我对 java 线程和 KeyEvents 有疑问吗?

c++ - 可以使用 boost::threads 中的 std::this_thread* 函数吗?

c# - 不在 Silverlight 中使用 ArrayList 的理由是什么?

python - 检查列表中的相等值并将它们设置为 0

Java ArrayList 尝试检查具有此名称的对象是否存在

java - 如何在 MacOS 上的 NetBeans 中创建 Java 应用程序?

java - 如果我更改 grails 域中的字段名称会怎样?