2012-10-04 54 views
0

我有几个关于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上没有明确的互斥排除?

+2

从原理上来说,不可能发送多个消息,按照定义,输出介质是串行(以太网)。问题是你愿意妥协什么? –

+0

您正在使用TCP,并且TCP中没有“消息”这样的东西,更不用说“原子”消息了。可能你真正在寻找的是UDP多播? – EJP

回答

1

是,作为原子作为这个广播会这样?或者在并行环境中有潜力可能不会全部在几乎同一时刻发送?

不知道你问这里。多线程不能同时使用Socket对象。如果正在同时访问套接字对象,您将需要进行同步。

如果你问是否所有的消息将由一个线程“同时”发送,那么答案是“它要看”。一个线程可以快速完成这项工作,但如果任何发送操作出于任何原因阻止了,那么它可能不会。它很大程度上取决于消息的大小以及套接字写入的频率。

在并发环境中,到套接字连接(设置为PrintWriter)的输出流已互斥吗?

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

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