2017-01-17 6 views
2

私は最近Apache Commons-IOのクラスCountingInputStreamを使用しました。カウンタフィールドを更新することによって、読み取られたバイト数を追跡​​するだけです。InputStreamを同期させることの利点は何ですか?

私は、カウンタがsynchronizedキーワードで更新されていることに気付きました。私が見つけることができる最高の情報源はIO-201ですが、理由は説明されていません。

私はApache Commonsコードが良質であることをいくつか読んでいますが、なぜ彼らがInputStreamでメソッドを同期させたのか不思議です。私は、スレッドの安全性がストリーム上で有用なプロパティであるとは考えていませんし、IO-201のコメント者もしません。

私はInputStreamに同時にアクセスしていないので、メソッドを同期させる有効な理由はありますか?または、データゴミを生成しないInputStreamに同時にアクセスする有効なユースケースがありますか?

+0

私はデータゴミを取得せずにInputStreamを同時に読み取る方法を心配することはできません。だから私は同時性がこの '同期化 'の動機づけになることはできないと考えます。しかし、たぶん私の限られた想像力です。私は心配していない、私はちょうどそれから何かを学ぶための動機を理解したい。 –

+0

わかりました。別のスレッドは 'getCount()'を呼び出すかもしれません。同期化アクションがなければ、メモリモデルが起動し、もう一方のスレッドはアップデートを見ることができません。私は満足しています。同期の代わりに揮発性でも、おそらく同じ仕事をするでしょうね。 –

+0

いいえ、volatile変数をインクリメントするとスレッドセーフではありません。 –

答えて

3

InputStreamに同時にアクセスしていないとすれば、そのメソッドを同期させる有効な理由はありますか?

いいえ、単一のスレッドからのみアクセスしているオブジェクトに対して同期メソッドを使用する有効な理由はありません。つまり、が変更可能状態(countフィールド)を保護するために同期するサードパーティのコードを使用しているため、自分で実装する以外のオプションはほとんどありません。

また、InputStreamに同時にアクセスしてデータゴミを生成しない有効なユースケースがありますか?

InputStream?おそらくそうではありません。 CountingInputStream?確かに... 1つのスレッドでは、私はCountingInputStream.read()を繰り返し呼び出してストリームを消費し、もう1つのスレッドでは、CountingInputStream.getCount()を繰り返し呼び出してUIを更新し、読み込んだ行の数を表示します。

関連する問題