transient
誰かが Java での修飾子とvolatile
修飾子の意味を説明できますか?
4 に答える
volatile
および修飾子は、フィールド タイプに関係なく、クラス1transient
のフィールドに適用できます。それを除けば、それらは無関係です。
修飾子は、クラスのtransient
インスタンスをシリアライズするときにフィールドを除外するように Java オブジェクトのシリアライゼーション サブシステムに指示します。オブジェクトがデシリアライズされると、フィールドはデフォルト値に初期化されます。つまりnull
、参照型の場合、ゼロまたはfalse
プリミティブ型の場合です。JLS ( 8.3.1.3transient
を参照) は何を意味するかを述べていませんが、 Java オブジェクトのシリアライゼーション仕様に準拠していることに注意してください。他のシリアル化メカニズムは、フィールドの-nessに注意を払うかもしれません。transient
または、彼らはそれを無視するかもしれません。
(JLS では、static
フィールドを として宣言することが許可されていることに注意してくださいtransient
。この組み合わせは Java オブジェクトのシリアライゼーションには意味がありません。静的なものをシリアライズしないためです。全面的に禁止しているわけではありません。)
修飾子は、フィールドへのvolatile
書き込みは常にメモリに同期的にフラッシュする必要があり、フィールドの読み取りは常にメモリから読み取る必要があることを JVM に通知します2。これは、揮発性としてマークされたフィールドが、ネイティブまたは標準のライブラリ ベースの同期を使用せずに、マルチスレッド アプリケーションで安全にアクセスおよび更新できることを意味します。同様に、volatile フィールドへの読み取りと書き込みはアトミックです。(これは、一部の JVM で「ワード ティアリング」の対象となる可能性がある >>non-volatile<<long
またはdouble
フィールドには適用されません。) JLS の関連部分は8.3.1.4、17.4、および17.7です。
1 - ただし、ローカル変数またはパラメーターに対してではありません。
2 - この説明は意図的に非公式で単純化されています。たとえば、揮発性書き込みの前に発生する不揮発性書き込みの可視性には、追加の意味があります。volatile
セマンティクスの正確で正式な詳細な仕様については、上記にリンクされている JLS Chapter 17 (Memory Model) のリファレンスを参照してください。JMM 仕様は、モデル化された動作に関するものであり、その動作がプラットフォーム レベルでどのように実装されているかには依存しないことに注意してください。
volatile
とtransient
キーワード
1)transient
キーワードはインスタンス変数と共に使用され、シリアル化プロセスからそれらを除外します。フィールドが である場合、transient
その値は永続化されません。
一方、volatile
キーワードは、Java 変数を「メイン メモリに格納されている」ことを示すために使用されます。
変数のすべての読み取りはvolatile
、CPU キャッシュからではなく、コンピューターのメイン メモリから読み取られます。volatile
変数へのすべての書き込みは、CPU キャッシュだけでなく、メイン メモリにも書き込まれます。
2)キーワードはキーワードtransient
とともに使用できませんが、とともに使用できます。static
volatile
static
3)transient
変数はデシリアライズ中にデフォルト値で初期化され、値の割り当てまたは復元はアプリケーション コードで処理する必要があります。
詳細については、私のブログを参照してください:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html
揮発性とは、他のスレッドがその特定の変数を編集できることを意味します。そのため、コンパイラはそれらへのアクセスを許可します。
http://www.javamex.com/tutorials/synchronization_volatile.shtml
一時的とは、オブジェクトをシリアル化すると、逆シリアル化でデフォルト値を返すことを意味します