【Java】スレッドの排他制御 ~synchronized 文 / volatile 修飾子 / Atomicな変数 ~

■ synchronized文

 * synchronized修飾子を付与したメソッドは、複数のスレッドから同時に呼び出されることがなくなる
 * クリティカル セクション (critical section)を実現できる
  (クリティカル セクションについては、以下の関連記事を参照のこと)
https://blogs.yahoo.co.jp/dk521123/37076571.html

使用上の注意

 * 使い過ぎるとアプリケーションの処理性能が低下する恐れあり

構文

synchronized メソッド
synchronized void method() {
   // Something
}
synchronized メソッド
private Object lockObject = new Object();

synchronized (lockObject) {
   // Something
}

デザインパターン「Single Thread Executionパターン」

 * 複数スレッドから同時に実行されたくない場合、
 「synchronized」をつけて、「同時にひとつのスレッドしか実行できない」ように制御する
 * 詳細は、以下の関連記事を参照のこと
https://blogs.yahoo.co.jp/dk521123/34224730.html

参考文献

http://java-code.jp/122

■ volatile修飾子

「ヴォラタイル」と読む
 * 日本語だと「揮発性修飾子」
 * スレッドからアクセスされても、内容が同期される
 * volatile修飾子をつけて変数を宣言すれば、
  その変数は複数のスレッドからアクセスされても内容が同期されることが保障される

構文

public volatile boolean isDone;

Findbugs「static フィールド {2} の間違った遅延初期化」

 * 対策としては「volatile」を付加すると消える

参考文献

http://kannokanno.hatenablog.com/entry/20120528/1338229536
http://www.wisdomsoft.jp/148.html
http://www.ibm.com/developerworks/jp/java/library/j-jtp06197.html
http://d.hatena.ne.jp/cero-t/20120830/1346267076
資格
http://sjc-p.obx21.com/word/ev/volatile.html

■ Atomicな変数

 * Atomic = 分割不可能な操作
  => javaの仕様上、long/double の代入/参照は、アトミックな操作ではない
 * Atomic に関す用語説明は、以下の関連記事を参照のこと
https://blogs.yahoo.co.jp/dk521123/37076571.html

Atomicクラス

 * AtomicXxxx(AtomicBoolean / AtomicInteger / AtomicIntegerArray etc) も用意されている

参考文献

https://www.jpcert.or.jp/java-rules/vna02-j.html
API仕様
http://e-class.center.yuge.ac.jp/jdk_docs/ja/api/java/util/concurrent/atomic/package-summary.html

関連記事

スレッドに関する用語

https://blogs.yahoo.co.jp/dk521123/37076571.html