【发布时间】:2015-03-30 19:38:27
【问题描述】:
我想将 PacketHandler 读取的 Packets 添加到 LinkedList 中
保存它们:
Packet toAdd = handler.handlePacket(socket.getInputStream());
synchronized (packetsRead) {
packetsRead.addLast(toAdd);
if (debug) {
System.out.println(packetsRead.getLast().toString());
}
}
和阅读它们
synchronized (packetsRead) {
if (packetsRead.size() > 0) {
return packetsRead.pollFirst();
}
}
使用第一种方法中的调试方法,我可以看到 最后一项永远不会相同。所以不同的数据包被添加到我的列表中。
但是当我尝试从不同的线程读取它们时,我总是得到相同的数据包。
例如,如果我的列表中有 10 个不同的数据包,它将返回第一个数据包 10 次。
如何使其线程安全?
【问题讨论】:
-
为什么不使用线程安全的实现? stackoverflow.com/questions/12043948/…
-
我在同一个对象上同步了它,为了测试目的,我把它改成了这个。对不起
-
如何访问阅读线程中的列表 - 您确定不是每次都复制列表以始终获得第一项吗?
-
我认为它不能是列表的副本,因为它只会返回与队列中元素相同的元素
-
请显示
packetsRead的定义并解释它的任何其他用法,您的代码在这里看起来不错。
标签: java multithreading linked-list thread-safety synchronized