java - BlockingQueue 对于所有线程来说始终都是一样的吗?

标签 java multithreading locking queue

我正在实现一个程序,其中主线程将各种消息推送到工作线程,而工作线程将工作结果推送回主线程。

为此,我计划使用两个队列,一个用于推送到工作线程,另一个用于从中拉出。

据我了解,线程会缓存对象,因此如果它们要add()将一个对象添加到另一个线程可以poll()的队列中,则此更改可能不会立即可见,即它可能不会同步。这是正确的吗?

但是,如果我要使用 BlockingQueue,则该队列上的所有操作都应该立即对所有线程可见?

最佳答案

这个答案假设您正在谈论线程安全的数据结构或构造。如果您使用常规的非线程安全字段,则不能保证它会起作用,但也不能保证它不会起作用。注意:这是对线程安全有用的单元测试,但并非万无一失。

this change might not be visible immediately, i.e. it might not be synchronized. Is this correct?

是的。延迟通常约为 50 - 100 纳秒,因此可能几乎是立即的。

all operations on this queue are supposed to be immediately visible to all threads?

这在真机中是不可能的。你可以说的是,你永远不应该因为可见性问题而出现错误,大多数情况下是非常轻微的延迟。 (但是,由于它会产生垃圾,因此在最坏的情况下,如果机器没有 hibernate ,则可能会出现 Full GC 延迟,在这种情况下,延迟可能是数小时或数天)

关于java - BlockingQueue 对于所有线程来说始终都是一样的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110803/

相关文章:

java - 如何在 Java 中取消转义 Java 字符串文字?

javascript - 我的 angularJS 文件上传不起作用。它显示错误的请求错误。如何解决?我正在使用 java spring

java - Gradle 同步失败 : Could not find com. android.tools.build :gradle:4. 0.1

multithreading - Servlet Multi-Threading,创建工作线程的地方

python - 使线程休眠直到事件 X 发生

javafx 2 javascript api - 获取 java Controller

java - 按特定顺序运行两个以上线程

c - 同步原语的简单/规范实现?

javascript - 锁只能用于多线程编程吗?

c# - 使我的线程池设置安全、干燥和可扩展的建议