【发布时间】:2015-03-17 08:56:50
【问题描述】:
我有一个用例,我需要向底层数据结构添加值并且需要维护顺序。我使用ConcurrentLinkedQueue 作为底层数据结构。以下是函数
public void put(V value) {
concurrentLinkedQueue.add(value);
}
这个语句是原子的吗,如果两个线程试图放入值,线程 A 首先(值 V1)和线程 B 第二个(值 V2),是否有可能首先添加 V2,然后再添加 V1。
【问题讨论】:
-
如果您能准确定义多线程环境意义上的first这个词的含义,我们或许能够回答您的问题?
-
@OldCurmudgeon 首先是调用
put的第一个线程。 -
@user592748 - 如果他们在多线程和多核环境中恰好同时调用会怎样。
-
@user592748 - 然后你应该给你的更新加上时间戳以维持秩序。你永远不应该依赖一种语言的无证特性。
-
@avk,我可以说,这不是一个过程,而是一个方法。实际上,我们有很多名称:例程、子例程、处理程序、过程、方法、函数、子程序、可调用单元,我不知道还有什么。我们如何称呼它取决于我们来自哪里。如果您练习函数式编程,那么您可能会为不改变任何对象状态的命名例程保留“函数”一词。如果您最熟悉任何受 Smalltalk 启发的语言,那么您永远不会说“函数”而总是说“方法”,如果您是 C 程序员,那么它们都是“函数”。
标签: java multithreading thread-safety atomic nonblocking