DatagramSocket.send方法是线程安全的吗?

15
我计划使用一个DatagramSocket实例,并从不同的线程调用其send方法,向不同的客户端发送UDP数据包。该方法是否是线程安全的,即从不同的线程调用此方法不会创建任何问题/不一致性/竞争条件?谢谢!
3个回答

9

1
我看到了这个,但是它缺少参考资料! - Shafiul
没错。那只是一篇复制自我在2006年贡献过的Sun Java论坛帖子的内容。它并不是规范性参考。 - user207421

9

UDP保证数据报能够完整地到达(如果它们到达的话)。换句话说,即使发送者存在多线程,也不会出现交错。这就是你所需要的。你实际上并不需要线程安全。但是,像所有系统调用一样,C send()系统调用是线程安全的,因为它们是原子操作。


6
Java封装器是否真的保证是线程安全的?我认为不是。 - turbanoff
@turbanoff,包装器是否线程安全并不重要,因为它未指定更改任何对象的状态。 - user207421
3
我不理解你的论点。例如,SimpleDateFormat并没有被指定为更改任何对象的状态。但是大家都知道,它不是线程安全的。 - turbanoff
@turbanoff 所以它在自身中改变状态。否则,它将是线程安全的。根据定义。 - user207421

1
答案是肯定的,本地操作系统上的层是线程安全的。
但是,由于网络吞吐量有限,如果发送的数据包超过了网络的处理能力,一些数据包将会被丢弃。

那么……它是线程安全的还是不安全的?在这个回答部分中有矛盾的答案。 - Aung Khant
是的,它是线程安全的。然而,由于网络吞吐量有限,如果发送的数据包超过了网络的处理能力,一些数据包将会被丢弃。但这与多线程并没有直接关系。 - Greelings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接