2

プリミティブフィールドのみがfinalとしてマークされているため、不変であるJavaオブジェクトがあるとします。

これで、いくつかのスレッドが作業を行うためにこのオブジェクトに含まれる情報を必要とするため、1つには2つの選択肢があります。

  1. 単一のインスタンスへの参照をすべてのスレッドに渡します。
  2. スレッドごとにオブジェクトのクローン/コピーを作成します。

基本的に、質問はこれに要約されます。たとえば、読み取りがより効率的になるため、JVMはオブジェクトをコピーすることで何らかのメリットが得られますか、それとも問題ではないため、単なるメモリの浪費になりますか?

4

6 に答える 6

5

技術的には、上記のスレッドが異なるCPUコアで実行されている場合、キャッシュが原因で、とにかく単一のオブジェクトの複数のコピーが存在します。そのため、オブジェクトのクローンを作成することに実際のメリットはなく、実際、複数のスレッドが同じプロセッサ上にある場合、パフォーマンスが低下する可能性があります。

実際、不変オブジェクトのクローンを作成することは逆効果のように思われます。この状況では、不変性は、すべてのスレッドが安全に使用できる共有の読み取り専用オブジェクトを作成する目的を果たすためです。

于 2012-08-16T16:14:33.050 に答える
4

あなたが言及したものを含め、複製が起こらないときにすべての利点があります:すべてのスレッドが同じメモリ位置を読み取る場合にのみ、読み取りはより効率的になります。たとえば、2つのスレッドが同じコアに割り当てられている場合、そのキャッシュは両方のスレッドの読み取りを満たすことができます。

于 2012-08-16T16:12:14.873 に答える
2

不変オブジェクトは、次の理由でプログラムを大幅に簡素化します。

1.構築、テスト、および使用が簡単

2.自動的にスレッドセーフであり、同期の問題はありません

3.コピーコンストラクタは必要ありません

4.クローンの実装は必要ありません

5. hashCodeが遅延初期化を使用し、その戻り値をキャッシュできるようにします

6.フィールドとして使用する場合は、防御的にコピーする必要はありません。適切なマップキーとセット要素を作成します(これらのオブジェクトは、コレクション内で状態を変更してはなりません)

7.構築時にクラス不変条件を一度確立し、再度チェックする必要がないようにします

8.常に「失敗の原子性」を持っている:不変のオブジェクトが例外をスローした場合、それが望ましくないまたは不確定な状態のままになることはありません

出典:http ://www.javapractices.com/topic/TopicAction.do?Id = 29

于 2012-08-16T16:13:48.263 に答える
2

不変オブジェクトを使用することの全体的なポイントは、スレッドセーフな方法でオブジェクトを共有できるため、手動でコピー/クローンを作成する意味がないことです。

たとえば、2つのスレッドが別々のCPUで実行されている場合、いずれにせよ、各CPUのキャッシュにフィールドの複数のコピーが存在する可能性があることに注意してください。

于 2012-08-16T16:14:04.433 に答える
1

おそらく、不変性の主な利点は、「安全な公開」と呼ばれるものです。これは、複雑さを恐れることなく、オブジェクトへの参照を多くのスレッド/プロセスに安全に与えることができることを意味します。

すべての人に同じ参照を与えるだけです-クローンを作成すると、この利点が無効になります。

于 2012-08-16T16:12:25.107 に答える
0

それは記憶の無駄になります。すべての情報を何度もコピーするのではなく、同じメモリアドレスへの新しい参照を作成する方がはるかにメモリを消費しません。このシナリオでは、オブジェクトをsynchronizedブロックなどのロックとして使用しているまれなケースを除いて、クローンを作成しても何も得られません。しかし、それでも、これは奇妙なアプリケーションになります。

于 2012-08-16T16:15:01.053 に答える