0

Java でのソケット プログラミングについていくつか質問があります。

  1. 複数のソケット接続で 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 として設定) への出力ストリームはすでに相互に排他的ですか? たとえば、2 つのスレッドが同時に PrintWriter に書き込みたいとします。PrintWriter で明示的な相互排除を行わないと、ストリームへの出力が台無しになりますか?

4

1 に答える 1

1

それはこのブロードキャストと同じくらいアトミックですか? または、並行環境ですべてがほぼ同時に送信されない可能性はありますか?

ここで何を尋ねているのかわからない。複数のスレッドがSocket同時にオブジェクトを使用することはできません。同時にアクセスされている場合は、ソケット オブジェクトを同期する必要があります。

すべてのメッセージが「同時に」単一のスレッドによって送信されるかどうかを尋ねている場合、答えは「場合によります」です。1 つのスレッドでこれをすばやく実行できますが、送信操作のいずれかが何らかの理由でブロックされると、ブロックされない可能性があります。メッセージのサイズとソケットへの書き込み頻度に大きく依存します。

並行環境では、ソケット接続 (PrintWriter として設定) への出力ストリームはすでに相互に排他的ですか?

コードを見るPrintWriterと、すべての操作がsynchronized. これは、 からソケットへの同時書き込みPrintWriterが問題ないことを意味します。例えば:

public void println(int x) {
    synchronized (lock) {
        print(x);
        println();
    }
}
于 2012-10-04T21:21:47.507 に答える