java - 如果我们通过一个线程添加并通过另一个线程删除,我们是否需要同步?

标签 java android multithreading thread-safety

在我的应用程序中,我从我的 socket.io 监听器(线程 1)收到了一些积分

每次我这样做时,我都会将它们添加到队列中,并且我有一个处理程序(另一个线程)每 x 毫秒运行一次以删除第一个值,并将其传递给 UI 线程。

Queue<Integer> fifo = new LinkedList<>();

// socket.io background thread (THREAD 1)
new run() {
     Integer[] points = myapplication logic;      
     for (int point : points)
        fifo.add (point);
}
// handler background thread (THREAD 2) runs every few milliseconds
new run {
   Integer fiPoint = fifo.remove();
   // THREAD 3 (MAIN UI THREAD)
   runOnUIThread() {
      do something with that fipoint;
   }
}

我是否需要使用同步队列,或者我当前的实现没问题?

最佳答案

java.util.Stack 中的每个方法都已经同步,因此绝对安全。但是您正在使用 Queue,这是灾难性的。

如果读取线程可以看到对象在队列中但看不到对象的内部,会发生什么情况?那会造成灾难。

考虑:

  1. Writer 线程标记队列中有一个对象。
  2. 读取线程发现队列中有一个对象。
  3. 读取线程访问对象的成员数据。
  4. Writer线程写入对象的成员数据。

糟糕,读者刚刚看到了错误的数据。您需要确保对对象的所有写入都与被告知对象在队列中的读取器线程具有“发生在之前”的关系。您的代码不包含执行此操作的任何内容。

关于java - 如果我们通过一个线程添加并通过另一个线程删除,我们是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42570285/

相关文章:

java.lang.ClassNotFoundException : org. springframework.web.servlet.DispatcherServlet 谷歌应用引擎

java - 将多个文本节点转换为单个文本节点的 XPath 函数

android - 多个 Activity ,相同的 onCreateOptionsMenu、onOptionsItemSelected 和 onKeyDown。我能以某种方式重用代码吗?

android - 在 locationRequest.setFastestInterval 之前收到位置

c# - 监控变化的应用程序

linux - 如何使用多线程进行 zlib 压缩(相同输入源)

java - 显示 java JTable 中的特定行

java - 为什么使用 Hibernate 和 Oracle 10g 方言通过 JPA 创建名为 hibernate_sequence 的序列?

android - 在 Android Studio build.gradle 中打印变量的简单方法?

multithreading - 既然 U32 已经实现了同步,为什么还要在 Rust 中使用 AtomicU32?