java - 如何在java线程中正确使用变量?

标签 java multithreading

我遇到了一个奇怪的情况,当我尝试在我创建的线程中使用成员变量时,它没有返回正确的值,下面是我的代码片段

new Thread() {
        public void run() {
            while (true) {
                //System.out.println(printQueue.isEmpty());
                while ((currentOrder = printQueue.poll())!= null) {
                    printall();
                }
            }
        }
    }.start();

printQueue是我定义的队列,当我尝试将值插入队列时,结果是不同的。
当我取消注释打印行时,此 currentOrder 将返回一个非空变量,但如果我注释该行,currentOrder 将始终返回 null。 这是如何发生的以及我应该采取什么措施来解决它?

最佳答案

LinkedList 类并非设计用于多线程应用程序。各个线程可以将 LinkedList 的状态缓存在其本地内存中,这可能会导致状态出现不一致。

您可能应该使用 java.util.concurrent.BlockingQueue相反,看看是否能解决问题。这可能是线程看不到更新的问题,但写入 System.out 会导致线程本地内存被刷新。

如果您想更多地了解这里发生的事情,您可能需要引用这个问题:

What does flushing thread local memory to global memory mean?

关于java - 如何在java线程中正确使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679726/

相关文章:

java - 有没有办法在Android上振动小于1毫秒?

java - 在ObjectMapper中全局配置JavaTimeModule而不是使用@datetimeformat

java - 如何使用 Apache POI 和 Java 添加多个不同的 Excel 列

Android:哪个线程调用.onSensorChanged?

java - 顺序运行 Java 线程

PHP:如何正确使用 socket_select() 和 socket_read()

c++ - 有没有办法并行运行 C++ 单元测试测试?

javascript - 如何在所有线程运行完毕后运行代码?

java - 从 xml 转换时是否可以保持 JSON 的排序,反之亦然

java - 类工厂方法作为抽象模板方法