この質問は、Javaコレクション(特にHashtableとVector)に関連していますが、他の場所にも適用される可能性があります。インターフェイスへのプログラミングと同期されたコレクション
私は多くの場所でプログラムのインターフェースがどれくらい良いのかを読んだことがあります。私は100%同意します。たとえば、基本的な実装を考慮しなくても、Listインタフェースにプログラムする機能は、デカップリングとテストの目的で最も効果的です。コレクションでは、内部ストレージ構造やランダムアクセス時間などの違いを考慮して、ArrayListとLinkedListが異なる状況下でどのように適用されるかを確認できます。ただし、これらの2つの実装は同じインターフェイスで使用できます。素晴らしいです。
私は配置できないようなものは、同期化された実装(特にHashtableとVector)がこれらのインタフェースにどのように適合しているかです。私にとって、彼らはモデルに合うようには見えない。基礎となるデータ構造の実装の大部分は、データの格納方法(LinkedList、Array、ソート済みツリーなど)が異なるように見えますが、同期はデータにアクセスできる条件(ロック条件)を処理します。メソッドがMapコレクションを返す例を見てみましょう。アプリケーションが並行性を全く考慮していないとしましょう。この場合、メソッドはインターフェイスを介して返す実装に関係なく操作します。誰もが満足しています。世界は安定している。
ただし、アプリケーションで並行性の面で注意が必要な場合はどうなりますか?基本的な実装を考慮せずに操作することはできません.Hashtableは問題ありませんが、他の実装も必要です。
1)コレクションを追加/削除するときに同期ブロックなどを使用して同期を強制します。しかし、同期化された実装(Hashtable)が返された場合、これは過度のものにならないでしょうか?
2)メソッドシグネチャを変更してHashtableを返します。しかし、これはHashtableの実装に密接に結びついており、その結果、インターフェイスへのプログラミングの利点がウィンドウの外に投げ捨てられます。
3)コンカレント・パッケージを使用し、メソッド・シグネチャを変更してConcurrentMapインタフェースの実装を戻します。私には、これは前進のようだ。
本質的に、同期化の問題は、インターフェイスにプログラミングする際に、基本的な実装について考えさせるようにするという点で、コレクションフレームワーク内でのミスフィットのようなものです。
ここでポイントが完全に不足していますか?
ありがとうございました。
キーは、ここで、またはそこにいくつかの 'synchronized'キーワードを追加すると、あなたのプログラムをスレッドセーフにしないということです。 'java.util.concurrent'コレクションでも、それらをプライベートな実装の詳細として保持したいとします。 –