我遇到了一个奇怪的情况,当我尝试在我创建的线程中使用成员变量时,它不会返回正确的值,下面是我的代码片段
new Thread() {
public void run() {
while (true) {
//System.out.println(printQueue.isEmpty());
while ((currentOrder = printQueue.poll())!= null) {
printall();
}
}
}
}.start();
printQueue
是我定义的队列,当我尝试将值推入队列时结果不同。
当我取消注释打印行时,此currentOrder
将返回一个非null变量,但如果我对该行进行注释,currentOrder
将始终返回null。
它是如何发生的以及我应该做些什么来解决它?
答案 0 :(得分:2)
LinkedList
类不适用于多线程应用程序。单个线程可以在其本地内存中缓存LinkedList
的状态,这可能导致状态不一致。
您应该使用java.util.concurrent.BlockingQueue
代替,看看是否能解决问题。这可能是线程没有看到更新的问题,但写入System.out
导致线程本地内存被刷新。
如果您想进一步了解这里发生的事情,可以参考这个问题:
What does flushing thread local memory to global memory mean?