Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

マルチスレッド学習のミッシングリンク

1,258 views

Published on

Published in: Technology
  • Be the first to comment

マルチスレッド学習のミッシングリンク

  1. 1. マルチスレッド学習の ミッシングリンク Satoshi Kobayashi 2013/02/09 1
  2. 2. はじめにマルチスレッドのアプリケーション 書いてますか? 2
  3. 3. ちなみにぼくはちょっと前まで書けませんでした 3
  4. 4. その頃の意識マルチスレッドこわい なんかすごいことになるんでしょ?やばいバグが出るんでしょ? しかも見つけられないんでしょ? 4
  5. 5. 途方も無い synchronized ってどこにつけるの? とりあえずつけときゃいいの?concurrent パッケージつかっときゃいいの? どう設計すればいいの? ※ 母国言語: Java 5
  6. 6. 今少しは成長した ※ ような気がする... 6
  7. 7. とはいえ今でもそんなに自信があるわけではない今でも意識はそんなに変わっていない マルチスレッドは依然としてこわい 7
  8. 8. 何が変わったのか やみくもにこわい ↓ ぐたいてきにこわい 8
  9. 9. 本題マルチスレッドの学習にはミッシングリンクがある ※ ような気がする... 9
  10. 10. どういうこと?マルチスレッドのとある箇所について 説明しているものが少ない 10
  11. 11. kwskA プログラム言語の入門書B マルチスレッドを対象にした本C ぐぐる 11
  12. 12. マッピングしてみる抽象度: 高 スレッドの概念 A B C (ぼくの意識ではここに何かあるのに簡潔に説明しているものが少ない) デザインパターンなど B C 各言語毎のスレッド API A C抽象度: 低 12
  13. 13. それは 概念以上デザインパターン未満 のなにか 13
  14. 14. たぶんアーキテクチャ・パターン? 14
  15. 15. で、何よ? 原則「スレッド間で共有されるオブジェクトを意識する」 15
  16. 16. 「当然でしょ」って人 この先読む必要ないです 16
  17. 17. そうなの?って人 ここから説明していきます 17
  18. 18. ただしスレッドの概念や API の説明は A C に譲ります 18
  19. 19. マルチスレッドのヤバさ競合データの不整合が起きるデッドロックザ・ワールド 19
  20. 20. 競合スレッド A 共有オブジェクト スレッド B get: 100 get: 100 set: 100 + 10 set: 100 + 10 110 ?! 20
  21. 21. デッドロックスレッド A 共有A 共有B スレッド B lock lock lock (block) lock (block) 21
  22. 22. それは知ってるよ何故使い古された説明を今更? 22
  23. 23. 共通項が見えるから どちらも「複数のスレッド」が「共有オブジェクト」 を操作している 23
  24. 24. つまり マルチスレッドで発生する問題は「複数のスレッド」が「共有オブジェクト」 を操作しているときに起こる ※ より具体的には変更 (書き込み) 操作を含むとき 24
  25. 25. 逆に言えば 共有オブジェクトが無い限りはマルチスレッドでも問題は起こらない 25
  26. 26. 具体例Tomcat で Servlet API を使ってプログラミング マルチスレッドについて意識することは (おそらくほとんど) 必要ない何故か? スレッド間でオブジェクトを共有していないから 各ワーカスレッドはリクエスト単位で生成される 全く別々の HttpServletRequest オブジェクトを持つ 26
  27. 27. どう意識すればいいのか 共有オブジェクトをスレッドセーフにする 27
  28. 28. つまりスレッド A 共有オブジェクト スレッド B こいつらのことは 特に気にしない こいつはいつ何時 並列に呼ばれても 良いように備える スレッドセーフ 28
  29. 29. この原則を理解するとマルチスレッド・デザインパターンなども 理解しやすくなる 29
  30. 30. Producer-Consumer パターンProducer Consumer Queueスレッド スレッド 仕事追加 仕事取得 仕事追加 仕事取得 30
  31. 31. わかることスレッド間でオブジェクトを共有しているしかも何か書き込んでいるQueue がスレッドセーフでないと問題が起こる 31
  32. 32. Thread-Per-Task パターンExecutor Runner A Runner Bスレッド スレッド スレッド 仕事開始 仕事開始 32
  33. 33. わかることスレッド間でオブジェクトを共有していないこのパターンは問題を引き起こさない 33
  34. 34. まとめマルチスレッドの学習ミッシングリンクがある気がするとても大事なことなのに何故か説明が少ないそれは以下の原則スレッド間で共有されるオブジェクトを意識する 34
  35. 35. ありがとうございました 35

×