我有一个下面的代码,我在套接字上使用synchronized:
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中选择任何一个套接字。有可能,多个线程可以选择相同的套接字来发送数据,或者多个线程可以每次选择不同的套接字来发送数据。以下是我能想到的情景:
synchronized
如何在这种情况下工作?是快还是会阻塞任何线程?synchronized
块之前等待其他线程,这意味着每个线程都在等待该套接字被释放?它会减慢任何速度吗?基本上我想弄清楚,使用socket
关键字对我可以遇到的所有场景使用synchronized
作为锁定是否会有任何性能损失。
答案 0 :(得分:1)
这种机制可以防止不同的线程同时将数据发送到同一个套接字并破坏您的数据。使用不同套接字的不同线程不会阻塞,虽然同步行为不是“免费”,但与通过网络发送数据相比,它可以忽略不计。
答案 1 :(得分:0)
但是,如果socket类是你自己的类,你可以更改代码。最好在send方法上添加同步,或者最好在所有方法上添加同步,以便没有其他线程可以在没有锁的情况下使用它。如果你不能改变它,你可以为Socket类创建包装类或代理,并使代理类中的方法同步。