実際、シリアル化の概念と、一時変数とローカル変数が serialversionuid にどのように関連しているか、およびシリアル化が実際にどのように行われているかについて知りたいですか?
2 に答える
1
基本的に、いいえ。はserialVersionUID
通常、クラスのどのバージョンが相互に (通常は) クラスター化された環境で互換性があるかを判断するために使用されます。任意のコンテキストでアプリケーションの複数のバージョンをサポートする場合は、このフィールドをインクリメントして、以前のバージョンのアプリケーションが新しい分野で爆発するのを防ぎます。
でマークされたフィールドtransient
はシリアル化されません。
最後に、volatile
複数のスレッドがフィールドにアクセスできる場合に、コンパイラによる安全でない最適化を防ぐために使用されます。たとえば、double checked-locking。ウィキペディアから、
J2SE 5.0 では、この問題は修正されています。volatile キーワードにより、複数のスレッドがシングルトン インスタンスを正しく処理できるようになりました。この新しいイディオムは [4] で説明されています。
// Works with acquire/release semantics for volatile // Broken under Java 1.4 and earlier semantics for volatile class Foo { private volatile Helper helper; public Helper getHelper() { Helper result = helper; if (result == null) { synchronized(this) { result = helper; if (result == null) { helper = result = new Helper(); } } } return result; } // other functions and members... }
于 2014-08-25T04:25:25.083 に答える