【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 の非アトム的な取扱い
http://www.y-adagio.com/public/standards/tr_javalang/17.doc.htm#28733
double 変数又は long 変数が volatile 宣言されていないとき,ロード,記憶,読取り,及び 書込み 動作の実行は,これらがそれぞれ32ビットの二つの変数であるかのように扱われる。
なるほど。