跨多个套接字的原子套接字消息

时间:2012-10-04 20:18:40

标签: java multithreading sockets concurrency

我对Java中的套接字编程有几个问题。

  1. 我有一个需要跨多个套接字连接发送一条消息的进程。 现在我有以下内容

    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
    

    这是否与此广播一样原子?或者在并发环境中是否有可能在几乎同一时刻发送它们?

  2. 在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经互斥?比如说,两个线程想要同时写入PrintWriter。如果没有在PrintWriter上明确互斥,是否会对流中的任何输出搞砸了?

1 个答案:

答案 0 :(得分:1)

  

这是否与此广播一样原子?或者在并发环境中是否有可能在几乎同一时刻发送它们?

不确定你在这里问的是什么。多线程不能同时使用Socket对象。如果同时访问套接字对象,则需要在套接字对象周围进行同步。

如果您询问所有消息是否将“同时”由单个线程发送,那么答案是“它取决于”。单个线程可以快速执行此操作,但如果任何发送操作阻止由于任何原因,则可能不会。它在很大程度上取决于消息的大小以及写入套接字的频率。

  

在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经相互排斥?

如果您查看PrintWriter代码,则可以看到所有操作均为synchronized。这意味着从PrintWriter并发写入套接字应该没问题。例如:

public void println(int x) {
    synchronized (lock) {
        print(x);
        println();
    }
}