在我的应用程序中,我从我的 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
,这是灾难性的。
如果读取线程可以看到对象在队列中但看不到对象的内部,会发生什么情况?那会造成灾难。
考虑:
- Writer 线程标记队列中有一个对象。
- 读取线程发现队列中有一个对象。
- 读取线程访问对象的成员数据。
- Writer线程写入对象的成员数据。
糟糕,读者刚刚看到了错误的数据。您需要确保对对象的所有写入都与被告知对象在队列中的读取器线程具有“发生在之前”的关系。您的代码不包含执行此操作的任何内容。
关于java - 如果我们通过一个线程添加并通过另一个线程删除,我们是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42570285/