我对Java中的套接字编程有几个问题。
我有一个需要跨多个套接字连接发送一条消息的进程。 现在我有以下内容
Socket[] connections; //Already initialized with all connections
for i=0 to connections.length - 1
Send Message across connection[i]; // a new PrintWriter linked to the output stream
这是否与此广播一样原子?或者在并发环境中是否有可能在几乎同一时刻发送它们?
在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经互斥?比如说,两个线程想要同时写入PrintWriter。如果没有在PrintWriter上明确互斥,是否会对流中的任何输出搞砸了?
答案 0 :(得分:1)
这是否与此广播一样原子?或者在并发环境中是否有可能在几乎同一时刻发送它们?
不确定你在这里问的是什么。多线程不能同时使用Socket
对象。如果同时访问套接字对象,则需要在套接字对象周围进行同步。
如果您询问所有消息是否将“同时”由单个线程发送,那么答案是“它取决于”。单个线程可以快速执行此操作,但如果任何发送操作阻止由于任何原因,则可能不会。它在很大程度上取决于消息的大小以及写入套接字的频率。
在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经相互排斥?
如果您查看PrintWriter
代码,则可以看到所有操作均为synchronized
。这意味着从PrintWriter
并发写入套接字应该没问题。例如:
public void println(int x) {
synchronized (lock) {
print(x);
println();
}
}