我有下面的代码,其中我正在套接字上使用同步:
public boolean send(final long addr, final byte[] enc, final Socket socket) {
ZMsg msg = new ZMsg();
msg.add(enc);
// using the socket as its own lock while accessing it
boolean sent;
synchronized (socket) {
sent = msg.send(socket);
}
msg.destroy();
retryHolder.put(addr, enc);
return sent;
}
我想了解套接字上的
synchronized
在这里如何工作?我大约有20个线程同时调用此send
方法,每次Socket
可以不同。我们大约有60个套接字可供选择,因此所有这20个线程都可以从60个套接字中选择任意一个套接字。有可能,多个线程可以选择同一套接字来发送数据,或者多个线程每次都可以选择不同的套接字来发送数据。以下是我可以想到的方案:我们有60个套接字需要处理,所以所有20个线程每次都选择不同的套接字来发送数据。那么在这种情况下套接字上的
synchronized
如何工作?它会很快还是会阻塞任何线程?在20个线程中,一些线程选择相同的套接字以随机发送数据。那么所有这些线程在进入
synchronized
块之前都会等待其他线程,这意味着每个等待该套接字释放的线程吗?那么它会减慢任何速度吗?我错过了其他情况吗?
基本上,我想弄清楚在所有可能遇到的情况下,使用
socket
关键字使用synchronized
作为锁定都会对性能产生任何影响。 最佳答案
该机制可以防止不同线程同时将数据发送到同一套接字并破坏数据。使用不同套接字的不同线程不会阻塞,尽管同步并非“免费”,但与通过网络发送数据相比,可以忽略不计。
关于java - 套接字对象上的同步锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47103202/