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

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

・スレッドAの処理

```

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

・スレッドBの処理

```

    outputStream.write(エラーメッセージ);
    outputStream.close();
    outputStream = null;
    
```

よろしくお願いします。
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