Javaキーワードtranientとvolatileの結び目


tranientとvolatileの二つのキーワードは一つは対象の序列化に使います。一つはスレッド同期に使います。全部Javaの中で高次の話題です。簡単にまとめてください。
トランスジェンダー
tranientはタイプの修飾子で、フィールドを修飾することしかできません。オブジェクトのプログレッシブ化の過程では、tranientとしてマークされた変数は、プログレッシブされません。
例:
class Test {

transient int a; //       

int b; //    

}
クラスTestのインスタンスオブジェクトが逐次的に(例えば、Testクラスのインスタンスオブジェクトtをハードディスクのテキストファイルt.txtに書き込む)場合、変数aの内容は保存されず、変数bの内容は保存される。
参考:
一つのオブジェクトの表示をバイトストリームに変換するプロセスをシリアル化(プログレッシブとも呼ばれる、serialzation)と呼び、バイトストリームからオブジェクトを再構築することを逆シリアル化(逆プログレッシブとも呼ばれる、deserialization)と呼ぶ。tranientはシリアル化されてはいけないデータのために言語レベルのタグデータ方法を提供しています。
volatile
volatileも変数の修飾子です。変数を修飾するだけです。volatile修飾のメンバー変数は、スレッドにアクセスするたびに、共有メモリからそのメンバー変数の値を読み返すように強制されます。また、強制スレッドは、メンバ変数が変化すると、変化値を共有メモリに返信する。このように、いつでも二つの異なるスレッドは、あるメンバー変数の同じ値を見る。
ここでJavaのメモリメカニズムを説明します。
Javaは主メモリを使って変数の現在値を保存しますが、スレッドごとに独立したワークメモリがあります。スレッドが変数にアクセスすると変数の値を自分のワークメモリにコピーします。これにより、スレッドが自分のワークメモリの変数を操作した後、ワークメモリの変数コピーの値がメインメモリの変数値と異なるようになります。
Java言語仕様では、最適な速度を得るために、共有メンバー変数のプライベートコピーをスレッドに保存することができ、また、スレッドが同期コードブロックに入っているか、または離れているときのみ、共有メンバー変数の元の値と比較することができると指摘している。
このように、複数のスレッドがあるオブジェクトと同時にインタラクションする場合には、スレッドがメンバー変数を共有する変化をタイムリーに得るように注意しなければならない。
volatileのキーワードはVMを提示します。このメンバー変数に対してプライベートコピーは保存できず、直接共有メンバー変数と対話するべきです。
提案を使用します。2つ以上のスレッドにアクセスするメンバー変数にvolatileを使用します。アクセスする変数がsynchronizedコードブロック内にあるか、定数の場合は使用しないでください。
volatileを使ってVMに必要なコードの最適化を遮断しましたので、効率的には低いです。必要な時にこのキーワードを使う必要があります。