我想知道函数值的计算以及将结果分配给变量是否在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多线程”。