SlideShare a Scribd company logo
Java Concurrency, A(nother)
Peek Under the Hood
David Buck
日本オラクル
JavaDay Tokyo 2016
自己紹介
バック デイビッド
• Java SE サステイニング エンジニアリング
• JVM のバグを直す人
• OpenJDK 8 Updates
Project Maintainer
• 趣味:プログラミング
予定
• はじめに
• 背景
– 余談その1:特殊相対性理論
• 歴史
• 実装
– 余談その2:HSDIS
• 将来
• まとめ
はじめに
動機
「私が並行処理のコードを書かないのに。。。」
Web サーバ
picture: Coolcaesar at the English language Wikipedia [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/)]
GUI
ライブラリ
picture: David Vignoni / ICON KING (http://icon-king.com) [LGPL (http://www.gnu.org/licenses/lgpl.html) or LGPL (http://www.gnu.org/licenses/lgpl.html)]
バッチ処理
picture: US Social Security Administration (http://www.ssa.gov/history/acalcs.html) [Public domain]
「私が並行処理のコードを書かないのに。。。」
「私が並行処理のコードを書かないのに。。。」
競合状態
picture: Sakurambo at English Wikipedia [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/)]
ハイゼンバグ
Bug Heisenberg
Heisenbug
picture: Bundesarchiv, Bild 183-R57262 / Unknown / CC-BY-SA 3.0 [CC BY-SA 3.0 de (http://creativecommons.org/licenses/by-sa/3.0/de/deed.en)]
観察者効果
picture: Christian Schirm (Own work) [CC0]
ハイゼンバグを防ぐために
• Java Memory Model
• synchronized キーワード
• java.util.concurrent
ハイゼンバグを防ぐために
• Java Memory Model
• synchronized キーワード
• java.util.concurrent
• XXX をやっちゃ駄目!
• YYY をしなっきゃ!
a² + b² == c²
picture: WTF Public License, Version 2
背景
メモリモデル
メモリモデル
定義その1
書き込まれた値が正しく読み込まれる条件を
明確にする仕様
void hogeMethod1() {
int localA = 42;
assert localA == 42;
}
static int staticA;
void hogeMethod2() {
staticA = 42;
assert staticA == 42;
}
int data = 0;
boolean ready = false;
void hoge3() {
while (!ready) {};
assert data == 42;
}
void hoge4() {
data = 42;
ready = true;
}
犯人その1
犯人その2
メモリオーダリング
void hoge5() {
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
a = a + 1;
}
メモリオーダリング
void hoge5() {
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
a = a + 1;
}
void hoge5() {
a = 2;
b = 2;
c = 3;
d = 4;
e = 5;
}
メモリオーダリング
void hoge5() {
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
a = a + 1;
}
void hoge5() {
b = 2;
c = 3;
d = 4;
e = 5;
a = 2;
}
原則
シングルスレッドコードの振る舞いが
変わらない
アウト・オブ・オーダー実行
picture: Amit6, original version (File:Superscalarpipeline.png) by User:Poil (Own work) [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)]
CPUの相違
Type Alpha ARMv7
PA-
RISC
POWER
SPARC
RMO
SPARC
PSO
SPARC
TSO
x86
x86
oostore
AMD64 IA-64 zSeries
load-
load
Y Y Y Y Y Y Y
load-
store
Y Y Y Y Y Y Y
store-
store
Y Y Y Y Y Y Y Y
store-
load
Y Y Y Y Y Y Y Y Y Y Y Y
Atomic
(loads)
Y Y Y Y Y
Atomic
(stores)
Y Y Y Y Y Y
Depend
ent
loads
Y
instruct
ion
cache
Y Y Y Y Y Y Y Y Y Y
chart source: https://en.wikipedia.org/wiki/Memory_ordering
CPU次第
緩い 厳しい
Alpha
X86
メモリバリア
int data = 0;
boolean ready = false;
void hoge3() {
while (!ready) {};
assert data == 42;
}
void hoge4() {
data = 42;
ready = true;
}
メモリバリア
int data = 0;
boolean ready = false;
void hoge3() {
while (!ready) {};
assert data == 42;
}
void hoge4() {
data = 42;
ready = true;
}
メモリバリア
int data = 0;
boolean ready = false;
void hoge3() {
while (!ready) {};
assert data == 42;
}
void hoge4() {
data = 42;
ready = true;
}
メモリバリアの種類
• store-store
• store-load
• load-store
• load-load
コンパイラのバリア
• GCC
– __asm__ __volatile__("":::"memory");
• VC++
– _ReadBarrier
– _WriteBarrier
– _ReadWriteBarrier
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
余談その1:特殊相対性理論
picture: Sakurambo (Own work) [Public domain]
余談その1:特殊相対性理論
A
B
C
余談その1:特殊相対性理論
A
B
C
A, B, C
余談その1:特殊相対性理論
A
B
C
A, B, C C, B, A
余談その1:特殊相対性理論
基準系によって見る順番が異なる
A
B
C
A, B, C C, B, A
唯一の正しいタイムラインの無さ
• 特殊相対性理論
– 各基準系によって順番が異なる
唯一の正しいタイムラインの無さ
• 特殊相対性理論
– 各基準系によって順番が異なる
• マルチスレッド処理
– スレッドによって観察する順番が異なる
メモリモデル
定義その2
• 開発者が頼ってもいい振る舞いを明確にする
メモリモデル
定義その2
• 開発者が頼ってもいい振る舞いを明確にする
• プラットフォームがやってもいい最適化を制限
する
歴史
Java Memory Model (JMM)
• Write once, run
anywhere
• 1995
• 言語仕様(JLS)の一部
• Happened-before
picture: Peter Campbell [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC BY-SA 4.0-3.0-2.5-2.0-1.0 (http://creativecommons.org/licenses/by-sa/4.0-3.0-2.5-2.0-1.0)]
happened-before
Leslie Lamport氏
• LaTex
• happened-before
picture: Leslie Lamport [GFDL (http://en.wikipedia.org/wiki/GFDL]
happened-before
void hoge5() {
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
a = a + 1;
}
happened-before
void hoge4() {
data = 42;
ready = true;
}
void hoge3() {
while (!ready)
{};
assert data ==
42;
}
happened-before
void hoge4() {
data = 42;
ready = true;
}
void hoge3() {
while (!ready)
{};
assert data ==
42;
}
happened-before
void synchronized
hoge4() {
data = 42;
ready = true;
}
void synchronized
hoge3() {
while (!ready)
{};
assert data ==
42;
}
警告:hoge3 が先に実行されるとデッドロックが発生する
happened-before
void synchronized
hoge4() {
data = 42;
ready = true;
}
void synchronized
hoge3() {
while (!ready)
{};
assert data ==
42;
}
警告:hoge3 が先に実行されるとデッドロックが発生する
JMM 仕様
元 JMM のキーワード
• synchronized
– 排他制御 (mutual exclusion)
– happened-before
元 JMM のキーワード
• synchronized
– 排他制御 (mutual exclusion)
– happened-before
• volatile
– 値の可視性
元 JMM の問題点
• volatileが happened-before を成立しない
• final の値が変わる
• 有利な最適化方法が禁じられていた
Doug Lea氏
• Java のマルチスレッド
の聖書の執筆
• High-level の並行処理
の Java ライブラリを公
開した
Java SE 5.0
• 現代の JMM
• Lea氏の並行ライブラリが追加される
picture: Zvi Roger [CC BY 3.0 (http://creativecommons.org/licenses/by/3.0)]
現代の JMM
• JSR-133
• 元 JMM の問題点を解決
– volatile が happens-before を成立
– final の値が変わらない
現代 JMM のキーワード
• synchronized
– 排他制御
– happened-before
• volatile
– 値の可視性
– happened-before
• final
– イミュータブル
volatile != atomic
volatile int id = 0;
int incID() {
return id++;
}
JSR-133 の volatile
void hoge4() {
data = 42;
ready = true;
}
void hoge3() {
while (!ready)
{};
assert data ==
42;
}
警告:hoge3 が先に実行されるとデッドロックが発生する
volatile boolean ready = false;
happened-before
• ロックの取得・開放
• volatile 読み込み・書き込み
• final “freeze” (コンストラクタ)
• 外部処理 (JNI)
– System.out.println()
– 入出力
• スレッド start()/join()
• j.u.concurrent の collections の操作
java.util.concurency
• JSR-166
• Doug Lee 氏のライブラリを導入
並行処理の制御
• java.util.concurency
• synchronized
– wait()/notify()
• volatile / final
抽象的
具体的
Fork/Join (JDK 7)
関数型プログラミング(JDK 8)
• ラムダ式
• Stream API
λ
実装
余談その2:HSDIS
• JITが生成するコードの可視化
• 逆アセンブラのプラグインが必要
– GNU binutils ベース
– base-hsdis
• コマンドライン引数
– +PrintAssembly
– +CompileCommand=print,*MyClass.myMethod
Demo
将来
JEP-188/JMM9
• JVM レベルの仕様
• C11/C++11のモデルとの互換性
• JDK 6以降の新機能を含む
– (例AtomicX.weakCompareAndSet())
まとめ
高いレベルの抽象化を利用する
• java.util.concurency
• synchronized
– wait()/notify()
• volatile / final
抽象的
具体的
仕様に対して開発する
• 稀にしか発生しない問題が多い
• JRE や プラットフォームによって変わる
• 避けるべき行為
– synchronized (new Object()) { }
– 動くようになるまで闇雲に volatile を追加する
テストの方針
• 出来るだけ本番環境と近い環境でテストする
– 同じハード
– 同じ JRE (バージョンも)
– 同じ設定
Java Concurrency in Practice
• Java 並行処理の聖書
• JSR-133 もカバー
まとめ
• 高いレベルの抽象化を利用する
• 仕様に対して開発すること
• テストは不可欠
• JCiP を読むこと
ありがとうございます!
参照
• [ JSR 133 (Java Memory Model) FAQ ]
https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
• [ Java Concurrency in Practice ]
http://jcip.net/
• [ Concurrent Programming in Java ]
http://gee.cs.oswego.edu/dl/cpj/
• [ The JSR-133 Cookbook for Compiler Writers ]
http://gee.cs.oswego.edu/dl/jmm/cookbook.html
• [ PrintAssembly ]
https://wiki.openjdk.java.net/display/HotSpot/PrintAssembly
• [ BASIC DISASSEMBLER PLUGIN FOR HOTSPOT DOWNLOADS ]
https://kenai.com/projects/base-hsdis/downloads

More Related Content

What's hot (20)

PDF
OpenJDK トラブルシューティング #javacasual
Yuji Kubota
 
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
PDF
JavaScript.Next
dynamis
 
PPTX
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Norito Agetsuma
 
PDF
動画共有ツール
tamtam180
 
PPTX
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
Kiyoshi Sawada
 
PDF
Hive undocumented feature
tamtam180
 
PPTX
Java トラブル解析支援ツール HeapStats のご紹介
Shinya Takebayashi
 
PPTX
Heap statsfx analyzer
Yasumasa Suenaga
 
PDF
tcpdump & xtrabackup @ MySQL Casual Talks #1
Ryosuke IWANAGA
 
PDF
Groovyで楽にSQLを実行してみよう
Akira Shimosako
 
PDF
MongoDB2.2の新機能
Shoken Fujisaki
 
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PDF
OpenJDK コミュニティに参加してみよう #jjug
Yuji Kubota
 
PDF
RubyGemsの落とし穴
Kazuhiro Nishiyama
 
PDF
JavaScript.Next Returns
dynamis
 
PDF
Cloud Foundry: Open Platform as a Service
Shunsuke Kurumatani
 
PDF
COMSTARでiSCSI - OpenSolaris勉強会 2011.08
tokuhy
 
PDF
Synthesijer zynq qs_20150316
Takefumi MIYOSHI
 
PPT
YAPC Asia 2010 30days Albumの裏側 後日談
Kensuke Nagae
 
OpenJDK トラブルシューティング #javacasual
Yuji Kubota
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
JavaScript.Next
dynamis
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Norito Agetsuma
 
動画共有ツール
tamtam180
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
Kiyoshi Sawada
 
Hive undocumented feature
tamtam180
 
Java トラブル解析支援ツール HeapStats のご紹介
Shinya Takebayashi
 
Heap statsfx analyzer
Yasumasa Suenaga
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
Ryosuke IWANAGA
 
Groovyで楽にSQLを実行してみよう
Akira Shimosako
 
MongoDB2.2の新機能
Shoken Fujisaki
 
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
OpenJDK コミュニティに参加してみよう #jjug
Yuji Kubota
 
RubyGemsの落とし穴
Kazuhiro Nishiyama
 
JavaScript.Next Returns
dynamis
 
Cloud Foundry: Open Platform as a Service
Shunsuke Kurumatani
 
COMSTARでiSCSI - OpenSolaris勉強会 2011.08
tokuhy
 
Synthesijer zynq qs_20150316
Takefumi MIYOSHI
 
YAPC Asia 2010 30days Albumの裏側 後日談
Kensuke Nagae
 

Similar to Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C] (20)

PPTX
Java をクラッシュさせて遊んでみよう!
YujiSoftware
 
PDF
Java/Androidセキュアコーディング
Masaki Kubo
 
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
 
PPTX
ななめ45°から見たJavaOne
AdvancedTechNight
 
PDF
Apache Torqueについて
tako pons
 
KEY
PlayFramework1.x基礎編
Asami Abe
 
PPTX
Introduction to GraalVM and Native Image
Koichi Sakata
 
PDF
Ptt391
Takefumi MIYOSHI
 
KEY
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 
PDF
Var handles jjug_ccc_spring_2018
David Buck
 
PDF
SDLoader SeasarCon 2009 Whire
Akio Katayama
 
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PE-BANK
 
PDF
Java in the World of Container by David Buck
オラクルエンジニア通信
 
PPT
Java 7
Tetsuya Yoshida
 
KEY
Inside frogc in Dart
Goro Fuji
 
PDF
PHP開発者のためのNoSQL入門
じゅん なかざ
 
PPTX
TDC20111031_Groovy_Geb
Nobuhiro Sue
 
KEY
RoR周辺知識15項目
saiwaki
 
PPTX
Cve 2013-0422
abend_cve_9999_0001
 
PDF
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
 
Java をクラッシュさせて遊んでみよう!
YujiSoftware
 
Java/Androidセキュアコーディング
Masaki Kubo
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
 
ななめ45°から見たJavaOne
AdvancedTechNight
 
Apache Torqueについて
tako pons
 
PlayFramework1.x基礎編
Asami Abe
 
Introduction to GraalVM and Native Image
Koichi Sakata
 
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 
Var handles jjug_ccc_spring_2018
David Buck
 
SDLoader SeasarCon 2009 Whire
Akio Katayama
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PE-BANK
 
Java in the World of Container by David Buck
オラクルエンジニア通信
 
Inside frogc in Dart
Goro Fuji
 
PHP開発者のためのNoSQL入門
じゅん なかざ
 
TDC20111031_Groovy_Geb
Nobuhiro Sue
 
RoR周辺知識15項目
saiwaki
 
Cve 2013-0422
abend_cve_9999_0001
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
 
Ad

More from David Buck (20)

PDF
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
David Buck
 
PDF
Java Bytecode Crash Course [Code One 2019]
David Buck
 
PDF
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
David Buck
 
PDF
invokedynamic for Mere Mortals [Code One 2019]
David Buck
 
PDF
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
David Buck
 
PDF
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
David Buck
 
PDF
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
David Buck
 
PDF
Z Garbage Collector
David Buck
 
PDF
Valhalla Update JJUG CCC Spring 2019
David Buck
 
PDF
JDK 10 へようこそ
David Buck
 
PDF
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
David Buck
 
PDF
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
David Buck
 
PDF
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
David Buck
 
PDF
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
David Buck
 
PDF
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
David Buck
 
PDF
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
 
PDF
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
David Buck
 
PDF
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
David Buck
 
PDF
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
David Buck
 
PDF
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
David Buck
 
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
David Buck
 
Java Bytecode Crash Course [Code One 2019]
David Buck
 
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
David Buck
 
invokedynamic for Mere Mortals [Code One 2019]
David Buck
 
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
David Buck
 
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
David Buck
 
Z Garbage Collector
David Buck
 
Valhalla Update JJUG CCC Spring 2019
David Buck
 
JDK 10 へようこそ
David Buck
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
David Buck
 
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
David Buck
 
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
David Buck
 
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
David Buck
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
David Buck
 
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
David Buck
 
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
David Buck
 
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
David Buck
 
Ad

Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]