我遇到了一个问题,我有一个类在连接到服务器时得到实例化。同步数据输出流
我在课堂上遇到问题的方法看起来像这样:
public void sendData(byte[] dataToSend) throws IOException {
sendLock.lock();
int dataLength = dataToSend.length;
dout.writeInt(dataLength);
dout.write(dataToSend, 0, dataLength);
dout.flush();
sendLock.unlock();
}
其中 “sendLock” 是的ReentrantLock,DOUT是DOUT =新的DataOutputStream类(socket.getOutputStream()); 这将适用于有限数量的线程,但如果我有大量的线程同时调用此方法,则会发生死锁,并且程序停止。死锁会在这里发生吗?这对我来说没有任何意义,因为我已经删除了所有其他的锁以排除它们,而我只能选择这个锁。无论如何,冲洗可能会导致事情挂起或什么?它似乎在某种程度上它永远不会释放锁,我不知道为什么。
如果我删除锁,我得到套接字错误,因为一个线程可能会在另一个线程有可能写入数据之前更改dataLength等等,但死锁不再发生。
作为参考,这里是接收端的run方法是这样的:
public void run() {
while (socket != null) {
try {
int dataLength = din.readInt();
byte[] data = new byte[dataLength];
din.readFully(data, 0, dataLength);
Event e = ef.getEvent(data);
node.onEvent(e);
} catch (SocketException se) {
System.out.println(se.getMessage());
break;
} catch (IOException ioe) {
System.out.println(ioe.getMessage()) ;
break;
}
}
}
为什么你会有大量的线程发送数据到同一个套接字?注意你的接收代码应该单独捕获'EOFException',而不记录它:这是正常的。您还应该在'DataOutputStream'和套接字输出流之间添加'BufferedOutputStream'。 [否则'flush()'是多余的。] – EJP 2015-02-10 23:48:26
客户端互相发送数据。可能在任何时候,例如,客户端A和客户端B都向客户端C发送数据。 – shparkison 2015-02-11 00:42:37
实际上,现在我想到了。你是对的,输出流被绑定到套接字上,不知道为什么我在想这个!这实际上有帮助,并且可能是我弄乱了的地方。实际上,我为每个客户端运行两个线程,一个用于发送,另一个用于接收。接收线程可能需要转发消息,所以此时可能客户端A的发送和接收都尝试使用相同的输出流发送...... – shparkison 2015-02-11 00:54:15