我想知道函数值的计算以及将结果分配给变量是否在Java中是原子操作。

例如:

我有一个线程安全优先级队列q。在q中,我保存了元素,每个元素都有一个rank,根据它被放置在队列中。另外,我有一个共享变量topRank,该变量应始终包含q中最顶层元素的等级。以下代码按线程数并行执行:

element = q.remove(); // do something with element
topRank = q.peek();

是否可能发生threadA从q中删除一个元素并计算q.peek()的值,并且恰好在将其分配给topRank之前被threadB中断,然后threadB从q中删除另一个元素并更新topRank。然后threadA将恢复为topRank分配不正确的值。

与官方文献的链接将不胜感激。

谢谢。

最佳答案

简短的答案是这些操作不是原子操作,您需要将同步写入代码中。这是一个巨大的主题,有关编写线程安全程序的知识很多。 Google表示“java线程安全”和“java多线程”。

09-11 18:08