2012-10-04 92 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(); 
    } 
}