2016-08-31 10 views
0

デシリアライゼーションがシングルトンの別のインスタンスを作成することを理解します。しかし、なぜ ?それは内部的にプライベートコンストラクタを呼び出しますか?デシリアライズされたインスタンスが別のインスタンスである場合、readResolveメソッドがどのインスタンスで呼び出されますか?デシリアライゼーションがシングルトンの別のインスタンスを作成する方法

編集:この質問はenumではない伝統的なシングルトンに関するものです。 提案されている既存の回答は、readResolveが内部的にどのように呼び出されたかを説明していないので、同じではありません。したがって、この質問は重複としてマークされるべきではありません。

+0

あなたはどんな種類のシングルトンについて話していますか、どんな状況ですか? –

+0

_デシリアライゼーションがSingletonの別のインスタンスを作成することを理解しています_シングルトンがEnumの場合、それは真実ではありません。 –

+0

列挙型ではないプレーンシングルトン.. –

答えて

0

デシリアライゼーションのものは何とか黒魔法です。

JVMは内部的にそれを行います。を使わずにを実行して、任意のコンストラクタを呼び出します。基本的には次のように動作します。

  1. JVMは、オブジェクトが
  2. が必要になることを「記憶」を提供し、それはシリアル化されたバイトを取り...そして、あなたの記憶にそれらを置きます。

したがって、はい。シングルトンをシリアライズするとき。同じJVM内でデシリアライズする場合、同じシングルトンを表す2つのオブジェクトを作成することは非常に可能です。

この種のバイナリ(デ)シリアライゼーションの多くの奇妙な副作用の1つです。

+0

これにより、別のインスタンスがどのように作成されるかを理解できません。また、インスタンスが異なる場合、どのインスタンスでreadResolveが呼び出されますか? –

+0

もう一度:JVMはもう一つの**メモリを構成します。つまり、あなたは同じシングルトンの2つのコピーを指し示す2つの異なる**参照**で終わります。そして、うーん、複写された素晴らしい答えがあります - それを読んだのですか? – GhostCat

+0

@sumitsachdevaそれを止めるのは何ですか? – EJP

関連する問題