Thread & Runnable
public class MyRunnable implements Runnable {
public void run() { ... }
}
Thread thread = new Thread(new MyRunnable());
thread.start();
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
java.util.concurrent
(Java 5.0 以降)
Slide 18
Slide 18 text
ExecutorService
ExecutorService service = …;
service.execute(runnable);
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
No content
Slide 22
Slide 22 text
非同期で起こる問題の一例
Slide 23
Slide 23 text
thread interference (非atomic処理)
class Counter {
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
Slide 24
Slide 24 text
No content
Slide 25
Slide 25 text
No content
Slide 26
Slide 26 text
1. Thread A: int c 取得
2. Thread B: int c 取得
3. Thread A: 取得した値をIncrement
4. Thread B: 取得した値をDecrement
5. Thread A: cに1を書き込み
6. Thread B: cに-1を書き込み
(6が5を上書き)
Slide 27
Slide 27 text
synchronized
class Counter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public int value() {
return c;
}
}
Slide 28
Slide 28 text
No content
Slide 29
Slide 29 text
No content
Slide 30
Slide 30 text
No content
Slide 31
Slide 31 text
synchronized
atomic
happens-before
Slide 32
Slide 32 text
happens-before
Slide 33
Slide 33 text
No content
Slide 34
Slide 34 text
No content
Slide 35
Slide 35 text
No content
Slide 36
Slide 36 text
data race
(memory-consistency error)
Slide 37
Slide 37 text
順番(happens-before)があれば
期待される状態を導ける
Slide 38
Slide 38 text
No content
Slide 39
Slide 39 text
少なくともどちらか一方が
writeである場合
conflicting access
data race (問題) の原因
volatile
“write to a volatile variable establishes
a happens-before relationship with
subsequent reads of that same
variable”
volatile int counter = 0;
CPUとキャッシュ
Stack Exchange -
Where exactly L1, L2 and L3 Caches
located in computer?
https://superuser.com/questions/1961
43/where-exactly-l1-l2-and-l3-caches-loc
ated-in-computer
キャッシュは「スレッド
ごとのメモリ空間」に関
わる
-> data race
-> happens-before
Slide 59
Slide 59 text
CPUとキャッシュ
Stack Exchange -
Where exactly L1, L2 and L3 Caches
located in computer?
https://superuser.com/questions/1961
43/where-exactly-l1-l2-and-l3-caches-loc
ated-in-computer
キャッシュは「スレッド
ごとのメモリ空間」に関
わる
-> data race
-> happens-before
data race
(memory-consistency error)
Slide 60
Slide 60 text
No content
Slide 61
Slide 61 text
No content
Slide 62
Slide 62 text
No content
Slide 63
Slide 63 text
同時に走るスレッドは
高々CPUコア数
Slide 64
Slide 64 text
同時に走るスレッドは
高々CPUコア数
Slide 65
Slide 65 text
同時に走るスレッドは
高々CPUコア数
Slide 66
Slide 66 text
同時に走るスレッドは
高々CPUコア数
Slide 67
Slide 67 text
GUIとThread
Slide 68
Slide 68 text
A Swing programmer deals with the following
kinds of threads:
● Initial threads, the threads that execute initial application
code.
● The event dispatch thread, where all event-handling code is
executed. Most code that interacts with the Swing framework
must also execute on this thread.
● Worker threads, also known as background threads, where
time-consuming background tasks are executed.
スレッド使用例
Swing guide UI framework
(Java 5.0以前から使われていた)
https://docs.oracle.com/javase/tutorial/uiswing
/concurrency/index.html
Slide 69
Slide 69 text
No content
Slide 70
Slide 70 text
No content
Slide 71
Slide 71 text
No content
Slide 72
Slide 72 text
No content
Slide 73
Slide 73 text
BrowserのEvent Loop
Slide 74
Slide 74 text
No content
Slide 75
Slide 75 text
event loop
Slide 76
Slide 76 text
event loop
Slide 77
Slide 77 text
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(b);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 78
Slide 78 text
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(b);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 79
Slide 79 text
funcB()
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 80
Slide 80 text
funcB()
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(b);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
funcC()
call stack
event loop
Slide 81
Slide 81 text
funcB()
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
funcC()
call stack
event loop
ajax コール
Slide 82
Slide 82 text
funcB()
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 83
Slide 83 text
funcB()
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 84
Slide 84 text
funcA()
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 85
Slide 85 text
main()
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
call stack
event loop
Slide 86
Slide 86 text
function funC(c) {
… //make an ajax call
}
function funcB(b) {
return funcC(c);
}
function funcA(a) {
return funcB(a);
}
funcA(“my user data string”);
event loop
ajax コールバック
タスクキュー
Slide 87
Slide 87 text
タスクキューも含めたアニメーション
Slide 88
Slide 88 text
ajax コール
Slide 89
Slide 89 text
ajax コールバック
Slide 90
Slide 90 text
No content
Slide 91
Slide 91 text
No content
Slide 92
Slide 92 text
No content
Slide 93
Slide 93 text
関数型プログラミングと
immutable object
Slide 94
Slide 94 text
少なくともどちらか一方が
writeである場合
conflicting accessは
data race (問題) の原因
Slide 95
Slide 95 text
Java Memory Model
でもdata raceは主要な関心事
https://www.cs.umd.edu/~pugh/java/memoryMod
el/jsr133.pdf
http://gee.cs.oswego.edu/dl/jmm/cookbook.html
http://www.cs.umd.edu/~pugh/java/memoryModel/
少なくともどちらか一方が
writeである場合
conflicting accessは
data race (問題) の原因
Slide 114
Slide 114 text
conflicting accessはの正しい管理は難しい
Slide 115
Slide 115 text
conflicting accessはの正しい管理は難しい
Slide 116
Slide 116 text
shared mutable: 複雑さの元凶
shared mutable: おもしろさの源
Slide 117
Slide 117 text
アプリケーションの状態をすべて
データベースで管理する方法
Slide 118
Slide 118 text
データベース周りの
ソースコードが複雑
Slide 119
Slide 119 text
複雑さのバランスを
アプリケーション側
との間でとる
Slide 120
Slide 120 text
オブジェクトの内部状態
Slide 121
Slide 121 text
Actorでオブジェクトの内部状態を隠蔽
Slide 122
Slide 122 text
Actorどうしはメッセージを送り合って通信
Slide 123
Slide 123 text
Akka actorコードサンプル
actor ! message
class MyActor extends Actor {
var state = ...
def receive = {
case MessageTypeX => ...
case MessageTypeY => ...
case MessageTypeZ => ...
}
}
The JSR-133 Cookbook for Compiler Writers
http://gee.cs.oswego.edu/dl/jmm/cookbook.html
JSR-133に深く関わったDoug Lea教授による情報。
The Java Memory Model
http://www.cs.umd.edu/~pugh/java/memoryModel/
JSR-133仕様書に載っていない周辺情報。
Simple, Fast, and Practical Non-Blocking and Blocking
Concurrent Queue Algorithms https://www.cs.rochester..
ConcurrentLinkedQueue実装に使われたアルゴリズム。
JSR-133 https://www.cs.umd.edu/~pugh/…
Java Memory Model仕様書。happens-beforeを始め様々な概
念やコンパイラ最適化の影響などが解説されている。
Slide 165
Slide 165 text
OSとCPU
Systems Performance https://www.amazon.com/gp…
Netflixのパフォーマンス分析エンジニアBrendan Gregg氏に
よる著書。CPUとスレッドについての章がある。
Brendan Gregg’s Home page
http://www.brendangregg.com/overview.html
Brendan Gregg氏の著書にも関わる様々な情報がある
See How a CPU works https://youtu.be/cNN_tTXABUA
Scott CPUという教育用の仮想的なCPUを題材に動画で解説
している。
Slide 166
Slide 166 text
GUIとThread
The Node.js Event Loop, Timers, and process.nextTick()
https://nodejs.org/uk/docs/guides/...
公式ドキュメント。各フェーズ毎の詳細な解説。
GitHub: libuv https://github.com/libuv/libuv/...
node.js内部で使われているイベントループの実装を含む非同
期I/Oライブラリ。Cで書かれている。
YouTube: What the heck is the event loop anyway? JSConf
https://youtu.be/8aGhZQkoFbQ
アニメーションを駆使したevent loop解説。100万再生以上。
Slide 167
Slide 167 text
MDN web docs: Concurrency model and Event Loop
https://developer.mozilla.org/en-US/docs/...
MozillaによるEvent Loop解説
Akka docs: https://akka.io/docs/
公式のドキュメント
edX: Programming Reactive Systems https://www.edx.org/...
AkkaのメンテナであったKonrad Malawski氏が中心となって
作ったオンライン学習コース
Akkaとactor model