如何在java Thread中正确使用变量?

时间:2014-03-27 06:18:12

标签: java multithreading

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

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

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

1 个答案:

答案 0 :(得分:2)

LinkedList类不适用于多线程应用程序。单个线程可以在其本地内存中缓存LinkedList的状态,这可能导致状态不一致。

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

如果您想进一步了解这里发生的事情,可以参考这个问题:

What does flushing thread local memory to global memory mean?