【发布时间】:2010-11-09 15:22:03
【问题描述】:
我有这种方法可以将消息写入套接字:
public void sendMessage(byte[] msgB) {
try {
synchronized (writeLock) {
log.debug("Sending message (" + msgB.length + "): " + HexBytes.toHex(msgB));
ous.write(HEADER_MSG);
ous.writeInt(msgB.length);
ous.write(msgB);
ous.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
现在一个名为 Bob 的线程想在某个不确定的时刻 X 关闭套接字,这意味着可能仍有线程在等待writeLock 发送它们的消息,甚至可能有一个线程正在编写它。
我可以通过让 Bob 在关闭套接字之前获取 writeLock 来解决后者,但我仍然可能会丢失尚未开始发送的消息,因为据我所知 synchronized 是不公平,Bob 可以在其他等待更长时间的线程之前获得锁。
我需要的是,在 X 之前对sendMessage 的所有调用都能正常工作,而在 X 之后的调用会引发错误。我该怎么做?
- 说明:Bob 是从套接字输入流中读取的线程,X 是在该流上收到“关闭”消息时。
【问题讨论】:
标签: java multithreading sockets networking concurrency