【问题标题】:Do I need to put some sort of mutual exclusion while multiple threads are writing on the same MulticastSocket?当多个线程在同一个 MulticastSocket 上写入时,我是否需要进行某种互斥?
【发布时间】:2020-02-21 15:34:08
【问题描述】:

我有一些线程正在同一个 MulticastSocket 上写入(取决于调度,可能会发生多于一个线程同时在 MulticastSocket 上写入的情况)。我是否必须通过使用某种形式的锁定让他们在每个计时器上写一个,或者 UDP 协议隐含地这样做?

【问题讨论】:

  • 没有。 UDP 数据报是原子的,系统调用是原子的,DatagramSocketImpl.send() 是同步的。
  • @user207421 - 我没有看到 send 在文档 herehere 中同步。我在哪里可以找到那个?请记住,实现可能会发生变化,您必须根据合约进行编程。
  • 现在我有点困惑。我是否应该像@user207421 所说的那样设置显式锁定?
  • @AlexandraBradan - user207421 指的是MulticastSocket 的特定实现(我猜,来自他的评论)使用DatagramSocketImpl.send()。你编程是为了contract,而不是实现。合同没有说它是线程安全的,所以你必须假设它不是。否则是不好的做法,是自找麻烦。如果您的代码在不同的 JDK 上运行,但实现方式不同(不同供应商的 JDK,或同一供应商的 JDK 的不同版本),则实现可能不同。

标签: java udp multicast multicastsocket


【解决方案1】:

它实际上与 UDP 没有任何关系。 documentation for MulticastSocket 并没有说它是线程安全的,所以你不能假设它是线程安全的。您无法知道它不会更新可能被同时访问损坏的内部结构(例如出站缓冲区)。

如果所有线程都使用MulticastSaocket 的同一实例,您需要确保它们不会同时调用其方法。您可以通过在实例上同步来轻松做到这一点:

synchronized (theSocket) {
    theSocket.send(/*...*/);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多