57015


SocketのInputStream、OutputStreamはスレッドセーフでしょうか？

以下のようなコードで、ソケットの送信処理（outputStram.writeメソッド）は、複数のスレッドから呼び出す場合は、排他制御が必要でしょうか？  
例えばスレッドAでメッセージを返信しているときに、  
何かしらの理由で、スレッドBがエラーメッセージを返信し、outputStreamをクローズしてもよいものでしょうか？  
（クローズした場合、スレッドAの送信処理は中断されるのでしょうか。）

・スレッドAの処理

[code]

    ServerSocket serverSocket = new ServerSocket(0);
    Socket socket = serverSocket.accept(); // ブロッキングされる（クライアントからの通信開始要求が来るまで待機）
    OutputStream outputStream = new BufferedOutputStream(socket.getOutputStream());
    outputStream.write(送信データ);
    
[/code]

・スレッドBの処理

[code]

    outputStream.write(エラーメッセージ);
    outputStream.close();
    outputStream = null;
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2019-07-26T12:14:26.807
56918
2019-07-31T11:25:40.503
2019-07-26T13:59:00.060
3605
35267
question
java
SocketのInputStream、OutputStreamはスレッドセーフでしょうか？


一般にI/OStreamはスレッドセーフではありません。

また、close()すると他のスレッドも切断されます。  
writeの最中に別スレッドからclose()したときに、通信が切断されるまでに送りきれるどうかはわかりませんが、そういう設計は避けるべきでしょう。

ただし、SocketのInputStreamとOutputStreamはおおよそ独立しています。  
Socket全体で同期するのではなく、InputStreamとOutputStreamそれぞれで同期させる（IとOそれぞれを1つのスレッドからのみ操作する）のがパフォーマンス的に有利になるでしょう。


CC BY-SA 4.0
2019-07-29T22:29:20.737
57015
2019-07-29T22:29:20.737
7572
56918
answer