せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Java】 64ビット変数とスレッドセーフの関係性って? パーフェクトJava学習感想文 その6

パーフェクトJavaを読んで改めてJavaを振り返り中。


経緯については学習記録その1をご参照ください。

以下、学んだこと。


 

オンデマンドインポートはなぜ良くないか

オンデマンドインポートって、
アスタリスクでフォルダ内全てのクラスをインポートするあれ。
import java.util.*;
みたいな。

単純名の衝突を防ぐためにもオンデマンドインポートは
なるべく避けましょう

確かに。なるほど。


 

Javaの広域脱出

  • ラベル文
  • 実行時例外

いろんな本で目にするけれど
goto文(広域脱出)自体が必ずしも悪いわけじゃない。

(実行時例外など)、広域脱出の1部には有効に使えるものもある、という話です。

なるほど。


 

longとdouble以外の型の変数の代入はアトミック

longとdouble型への変数の代入はどうしてアトミックでないかというと、
この2つは64ビットだから。
へー!
前半32ビットと後半32ビットが別々のスレッドの代入結果になることがありえるから。
すごい根本的!
atomicパッケージっていうのがあるんだ。
知らなかった。

アトムとは

アトム的(atomic): どのような環境においても, 決して割込みを受けず,不完全な状態に留まることのないオペレーションを示す。

http://www.y-adagio.com/public/standards/tr_javalang/javacls0.htm‎

 
仕様にも書いてあった

double 及び long の非アトム的な取扱い
double 変数又は long 変数が volatile 宣言されていないとき,ロード,記憶,読取り,及び 書込み 動作の実行は,これらがそれぞれ32ビットの二つの変数であるかのように扱われる。

http://www.y-adagio.com/public/standards/tr_javalang/17.doc.htm#28733

なるほど。