Thread & Runnable
public class MyRunnable implements Runnable {
public void run() { ... }
}
Thread thread = new Thread(new MyRunnable());
thread.start();
Slide 25
Slide 25 text
No content
Slide 26
Slide 26 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
https://docs.oracle.com/javase/tutorial/uiswing
/concurrency/index.html
Slide 27
Slide 27 text
No content
Slide 28
Slide 28 text
No content
Slide 29
Slide 29 text
No content
Slide 30
Slide 30 text
java.util.concurrent
(Java 5.0 以降)
Slide 31
Slide 31 text
ExecutorService
ExecutorService service = …;
service.execute(runnable);
Slide 32
Slide 32 text
No content
Slide 33
Slide 33 text
No content
Slide 34
Slide 34 text
No content
Slide 35
Slide 35 text
非同期で起こる問題の一例
Slide 36
Slide 36 text
thread interference (非atomic処理)
class Counter {
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
Slide 37
Slide 37 text
No content
Slide 38
Slide 38 text
No content
Slide 39
Slide 39 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 40
Slide 40 text
synchronized
class Counter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public int value() {
return c;
}
}
Slide 41
Slide 41 text
No content
Slide 42
Slide 42 text
No content
Slide 43
Slide 43 text
No content
Slide 44
Slide 44 text
synchronized
atomic
happens-before
Slide 45
Slide 45 text
happens-before
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
No content
Slide 48
Slide 48 text
No content
Slide 49
Slide 49 text
data race
(memory-consistency error)
Slide 50
Slide 50 text
順番(happens-before)があれば
期待される状態を導ける
Slide 51
Slide 51 text
No content
Slide 52
Slide 52 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 70
Slide 70 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 71
Slide 71 text
No content
Slide 72
Slide 72 text
No content
Slide 73
Slide 73 text
No content
Slide 74
Slide 74 text
AjaxとGoogle Maps
Slide 75
Slide 75 text
No content
Slide 76
Slide 76 text
Google Maps以前
Slide 77
Slide 77 text
AjaxとGoogle Maps
Slide 78
Slide 78 text
Event LoopとAjax
Slide 79
Slide 79 text
No content
Slide 80
Slide 80 text
event loop
Slide 81
Slide 81 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 82
Slide 82 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 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
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 85
Slide 85 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 86
Slide 86 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 87
Slide 87 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 88
Slide 88 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 89
Slide 89 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 90
Slide 90 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 コールバック
タスクキュー
少なくともどちらか一方が
writeである場合
conflicting accessは
data race (問題) の原因
Slide 152
Slide 152 text
conflicting accessはの正しい管理は難しい
Slide 153
Slide 153 text
conflicting accessはの正しい管理は難しい
Slide 154
Slide 154 text
shared mutable: 複雑さの元凶
shared mutable:おもしろさの源
Slide 155
Slide 155 text
アプリケーションの状態をすべて
データベースで管理する方法
Slide 156
Slide 156 text
データベース周りの
ソースコードが複雑
Slide 157
Slide 157 text
複雑さのバランスを
アプリケーション側
との間でとる
Slide 158
Slide 158 text
オブジェクトの内部状態
Slide 159
Slide 159 text
Actorでオブジェクトの内部状態を隠蔽
Slide 160
Slide 160 text
Actorどうしはメッセージを送り合って通信
Slide 161
Slide 161 text
Akka actorコードサンプル
actor ! message
class MyActor extends Actor {
var state = ...
def receive = {
case MessageTypeX => ...
case MessageTypeY => ...
case MessageTypeZ => ...
}
}
文献
Our World in Data https://ourworldindata.org/internet
世界のインターネットユーザ数の統計。
Statista https://www.statista.com/statistics/...
年間スマートフォン出荷台数の統計。
https://twitter.com/csgillespie/status/…
CPUクロック周波数に関するグラフ付きツイート。
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 196
Slide 196 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 197
Slide 197 text
AjaxとGoogle Maps
YouTube: Screen record of Google Maps in 2005
https://youtu.be/PDG6tELjCOE
一般ユーザによる録画と思われる。
YouTube: What the heck is the event loop anyway? JSConf
https://youtu.be/8aGhZQkoFbQ
アニメーションを駆使したevent loop解説。100万再生以上。
Slide 198
Slide 198 text
C10k problem
ゆううきブログ: 2015年Webサーバアーキテクチャ序論
https://youtu.be/PDG6tELjCOE
現さくらインターネット研究所の坪内佑樹さんのブログ。C10k
問題や当時のサーバアーキテクチャを画像とともに解説。
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で書かれている。
Slide 199
Slide 199 text
Inside NGINX: How We Designed for Performance & Scale
https://www.nginx.com/blog/...
nginx公式のアーキテクチャ解説。
MDN web docs: Concurrency model and Event Loop
https://developer.mozilla.org/en-US/docs/...
MozillaによるEvent Loop解説
JavaScript Promiseの本
https://azu.github.io/promises-book/
JavaScriptを中心に著名なエンジニアであるazu氏が書いた
Promiseおよびasync/awaitを解説したウェブ上の本
JavaScript promise, async/await
Slide 200
Slide 200 text
Akka docs: https://akka.io/docs/
公式のドキュメント
edX: Programming Reactive Systems https://www.edx.org/...
AkkaのメンテナであったKonrad Malawski氏が中心となって
作ったオンライン学習コース
Scala: Futures and Promises
https://docs.scala-lang.org/overviews/core/futures.html
Scala公式のFutureのドキュメント。Chainingの参考になる。
Akkaとactor model