SlideShare uma empresa Scribd logo
1 de 41
Actor &       STM
  じゅんいち☆かとう
    @j5ik2o
並行処理 難しい
何が難しいか
スレッドセーフ
 が難しい
原子性 可視性 順序性
スレッドと通信する
ことってあるよねー
Q1.スレッドを止められるか...
public class StopThread implements Runnable {
 private boolean terminate;
 public void run() {
   while (! terminate) {
      // なにかの処理
      }
    }
    public void setTerminate(boolean terminate) {
      this. terminate = terminate;
    }
}
HotSpot ServerVMなら...

   if (!terminate) {
         while(true){
           // なにかの処理
       }
   }
スレッド単位の
セマンティクス
こう思ったら間違いのもと

スレッドA   terminate ← true



                           terminate



スレッドB   true ← terminate
こう思ったら間違いのもと

スレッドA   terminate ← true




スレッドB   false ← terminate
        true ← terminate
メモリモデルはスレッド単位

スレッドA   terminate ← true    terminate(true)




スレッドB   false ← terminate   terminate(false)
メモリモデルはスレッド単位

スレッドA   terminate ← true    terminate(true)



                            大域のterminate



スレッドB   false ← terminate   terminate(false)
メモリモデルはスレッド単位

スレッドA   terminate ← true    terminate(true)


                同期化しないと
                  見えない      大域のterminate



スレッドB   false ← terminate
        true ← terminate    terminate(false)
                            terminate(true)
これは可視性の問題




 http://www.flickr.com/photos/teegardin/5547069087/sizes/m/in/photostream/
volatileェ...
public class StopThread implements Runnable {
  private volatile boolean terminate;
  public void run() {
      // (2) Volatile Load
     while (! terminate) {
         // スレッドで行う処理
     }
  }
  public void setTerminate(boolean terminate) {
    // (1) Volatile Store
    this. terminate = terminate;
  }
}
Q2.x,yの結果はどうなる?
x = 0; y = 0; a = 0; b = 0;
class AThread extend          class BThread extend
Runnable {                    Runnable {
  @Override                     @Override
  public void run() {           public void run() {
    a = 1;                        b = 1;
    x = b;                        y = a;
  }                             }
}                             }
(1,1),(1,0),
(0,1),(0,0)
何回目で発生したか   (x   ,   y)
004590      (1   ,   1)
005606      (0   ,   0)
045450      (0   ,   1)
045451      (1   ,   0)
105747      (0   ,   0)
129356      (0   ,   0)
これは順序性の問題




 http://www.flickr.com/photos/wahlander/3808866872/sizes/m/in/photostream/
(可変な)変数の共有と
 ロック争奪に基づく
   共有データ・
   ロックモデル
• 読み書きしようとしているデータが他
 のスレッドから読み書きされないか。
 どのようなロックがかけられている
 か。

• メソッドを呼び出す際にどのような
 ロックを取得するか。その呼び出しに
 よってデットロックがないか。
Scala with Actor
共有なしの
メッセージ交換モデル
こんな感じ...
メッセージを受信するActor
class MyActor extends Actor {
   def act() = { // Runnable#run相当
     loop { // while(true)の簡略表現
       receive { // メッセージの待ち受け(ブロックする)
         case "end" => exit
         case msg: String => println(msg)
       }
     }
   }
}
val myactor = new MyActor
myactor.start()
// 文字列を渡す
myactor ! “Hello”
// 終了メッセージを渡す
myactor ! “end”
返事を返すActor
val myactor = actor {
  loop {
    receive {
      case "end" => exit
      case "Hello" => reply("World")
    }
  }
}
// 戻り値を取得(返事が戻るまでブロック)
val result = myactor !? “Hello”
Futureを返すActor
val myactor = actor {
   loop {
     receive {
       case "end" => exit
       case numbers: List[Int] =>
        重いソート処理
        reply(result)
     }
   }
}
// futureパターン
val future = myactor !! largeNumbers
while(!future.isSet){ Thread.sleep(1000) }
val result = future()
もっと簡潔に
val myactor = actor {
  loop {
    receive {
      case "end" => exit
      case msg: String => println(msg)
    }
  }
}
// 文字列を渡す(ブロックしない)
myactor ! “Hello”
// 終了メッセージを渡す (ブロックしない)
myactor ! “end”
reactはスレッドを節約する
val myactor = actor {
  loop {
    react {
       case "end" => exit
       case numbers: List[Int] =>
        重いソート処理
        reply(result)
    }
    // 制御を返さないので,ここは実行できない
  }
}
リソースを共有しない利点
class MyActor extends Actor {
   def act() = { // Runnable#run相当
     loop { // while(true)の簡略表現
       receive { // メッセージの待ち受け(ブロックする)
         case "end" => exit
         case msg: String => println(msg)
       }
     }
   }
}                             シングルスレッド脳
val myactor = new MyActor
myactor.start()                 で考えればよい
// 文字列を渡す
myactor ! “Hello”
// 終了メッセージを渡す
myactor ! “end”
mutalbleなメッセージはやめよう
class Money(var amount:BigDecimal,     val actorA = new MyActor
  var currency: Currency) {
  def plus(add: Money):Unit = {        val actorB = new MyActor
     var a = amount                    val money = new Money(10,
     a = a + add.amount
     amount = a                        Currency.getInstance("JPY"
  }                                    ))
  // いろいろ省略
                                       actorA ! ("set", money)
}                                      actorB ! ("set", money)
class MyActor extends Actor {          actorA ! ("add", money)
  var money: Money = _                 actorB ! ("add", money)
  def act() = {
    loop {
      react {
        case "end" => exit
        case ("set", m) => money = m
        case ("add", m) =>
         money.plus(m)
      }
    }
  }
}
mutalbleなメッセージはやめよう
class Money(var amount:BigDecimal, val actorA = new MyActor
  var currency: Currency) {
  def plus(add: Money):Unit = {    val actorB = new MyActor
     var a = amount                val money = new Money(10,
     a = a + add.amount
     amount = a                    Currency.getInstance("JPY"
  }                                ))
  // いろいろ省略
                        amount 参照の可視性
                                   actorA ! ("set", money)
}                                  actorB ! ("set", money)
                        plusメソッドの原子性
class MyActor extends Actor {          actorA ! ("add", money)
  var money: Money = _                 actorB ! ("add", money)
  def act() = {
    loop {
      react {
        case "end" => exit
        case ("set", m) => money = m
        case ("add", m) =>
         money.plus(m)
      }
    }
  }
}
STM
(Software Transcational
      Memoery)
スレッドセーフ?
    class Sequence {
    private var value = 0
    def getValue = value
    // ↓ スレッドセーフか?
    def getAndIncrement() = {
     value += 1 // Java だと value++
        value
    }
}
スレッドセーフ?
二つのスレッドから


sequence.getAndIncrement()


を1000回呼び出したら、最後
に2000になるか
0182   1998
0848   1998
3438   1998
3714   1998
3950   1998
レースコンディション
これは原子性の問題




 http://www.flickr.com/photos/swellzombie/4303343824/sizes/m/in/photostream/
ロックで同期化
class Sequence {
  private var value = 0
  def getValue = value
   // ↓ ロックが必要
  def getAndIncrement() = synchronized {
    value += 1
    value
  }
}
STM(Ref)
class Sequence {
  private var value = Ref(0)
  def getValue = value.get
  def getAndIncrement() = atomic {
    value alter (_ + 1)
  }
}
class Ref[T] ...
def alter(f: T T): T = {
    val value = f(get)
    set(value)
    value
}

Mais conteúdo relacionado

Mais procurados

Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックスTomoharu ASAMI
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swiftnecocen
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lensNaoki Aoyama
 
Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】Yukiko Kato
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
JastAdd & JastAddJ クリックチュートリアル
JastAdd & JastAddJ クリックチュートリアルJastAdd & JastAddJ クリックチュートリアル
JastAdd & JastAddJ クリックチュートリアルFuminobu Takeyama
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Nagi Teramo
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01nagachika t
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Kenji Otsuka
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説JPCERT Coordination Center
 
Active Directoryデータの Security Descriptor
Active Directoryデータの Security DescriptorActive Directoryデータの Security Descriptor
Active Directoryデータの Security DescriptorMichio Koyama
 

Mais procurados (20)

Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックス
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lens
 
Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
JastAdd & JastAddJ クリックチュートリアル
JastAdd & JastAddJ クリックチュートリアルJastAdd & JastAddJ クリックチュートリアル
JastAdd & JastAddJ クリックチュートリアル
 
講座Java入門
講座Java入門講座Java入門
講座Java入門
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Introduction Xtend
Introduction XtendIntroduction Xtend
Introduction Xtend
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説Javaセキュアコーディングセミナー東京第1回演習の解説
Javaセキュアコーディングセミナー東京第1回演習の解説
 
Active Directoryデータの Security Descriptor
Active Directoryデータの Security DescriptorActive Directoryデータの Security Descriptor
Active Directoryデータの Security Descriptor
 

Destaque

Sbt職人のススメ
Sbt職人のススメSbt職人のススメ
Sbt職人のススメ潤一 加藤
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトTakehiko YOSHIDA
 
第一回Scala会議
第一回Scala会議第一回Scala会議
第一回Scala会議潤一 加藤
 
某S社のddd(メイリオ)
某S社のddd(メイリオ)某S社のddd(メイリオ)
某S社のddd(メイリオ)kumake
 
Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例侑亮 原田
 
Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Koichi Sakata
 
GANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経ったGANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経ったYasuyuki Sugitani
 
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)Yuki Katada
 
JPEGのDCTブロックで コンテンツ指向のトリミング
JPEGのDCTブロックで コンテンツ指向のトリミングJPEGのDCTブロックで コンテンツ指向のトリミング
JPEGのDCTブロックで コンテンツ指向のトリミングYohsuke Furuta
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する増田 亨
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on ScalaTanUkkii
 
Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11Tsunenori Oohara
 

Destaque (12)

Sbt職人のススメ
Sbt職人のススメSbt職人のススメ
Sbt職人のススメ
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフト
 
第一回Scala会議
第一回Scala会議第一回Scala会議
第一回Scala会議
 
某S社のddd(メイリオ)
某S社のddd(メイリオ)某S社のddd(メイリオ)
某S社のddd(メイリオ)
 
Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例Scala × DDD × 弊社実践例
Scala × DDD × 弊社実践例
 
Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今
 
GANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経ったGANMA!でDDDをやってみてから1年くらい経った
GANMA!でDDDをやってみてから1年くらい経った
 
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)Introduction to GraphQL in Scala (ScalaMatsuri 2017)
Introduction to GraphQL in Scala (ScalaMatsuri 2017)
 
JPEGのDCTブロックで コンテンツ指向のトリミング
JPEGのDCTブロックで コンテンツ指向のトリミングJPEGのDCTブロックで コンテンツ指向のトリミング
JPEGのDCTブロックで コンテンツ指向のトリミング
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
 
Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11Elixirハンズオン-2017-03-11
Elixirハンズオン-2017-03-11
 

Semelhante a Actor&stm

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentationJason Namkung
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Kota Mizushima
 
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Kota Mizushima
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説Ryuji Iwata
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 

Semelhante a Actor&stm (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Flow.js
Flow.jsFlow.js
Flow.js
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
Move semantics
Move semanticsMove semantics
Move semantics
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
大人のお型付け
大人のお型付け大人のお型付け
大人のお型付け
 
pecl-AOPの紹介
pecl-AOPの紹介pecl-AOPの紹介
pecl-AOPの紹介
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本
 
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 

Actor&stm

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. 巻き上げ。最適化していいことになっているから、\n
  8. \n
  9. スレッドAで書き込んだら、次のスレッドBで読み込めるとは限らない。\n
  10. スレッドAで書き込んだら、次のスレッドBで読み込めるとは限らない。\n
  11. スレッドAで書き込んだら、次のスレッドBで読み込めるとは限らない。\n
  12. スレッドAで書き込んだら、次のスレッドBで読み込めるとは限らない。\n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. (1)のVolatile Storeの結果が(2)のVolatile Loadで見えることが保証される。volatileでなくてもAtomicBooleanでもよいですね。可変な変数はいろいろややこしい。\n
  23. 二つのスレッドが同時で動いたとしたら、x, yの結果はどうなりますか。\n
  24. 同期化したメモリアクセスではないので、スレッドのスケジューリング次第で運任せ。\n
  25. 結構な頻度でおこります。\n
  26. 理屈はこうです。スレッドAの命令がリオーダーされた場合は0,0となります。\n
  27. \n
  28. \n
  29. このように、そもそも人間のメンタルモデルから遠いノウハウを要求されてしまうのが、共有データ・ロックモデルです。ですから、本当にスレッドセーフで、スループットの出る マルチスレッドプログラミングができるプログラマは非常に少ないですし、これから目指すのも難しいということが言えます。\n
  30. \n
  31. 共有データロックモデルは簡単にデットロックを引き起こしてしまう可能性があるが、アクターは回避しやすい。これからは並行処理は、アクターから考えるべきです。\n
  32. メッセージパッシングによる抽象度の高い並行処理モデルが、アクターモデルです。アクターとしてはErlangが有名。アクターはスレッドとメールボックスが一体になったようなオブジェクトです。アクターに何かを依頼するときはメッセージを送信します。アクターで受信したメッセージはキューで管理され、キューから取り出されたメッセージに応じた処理が実行されます。\n
  33. リソースを共有しないので、シングルスレッドモデルでよいのです。\n
  34. \n
  35. \n
  36. actorという関数を引数に取るファクトリメソッド。\n
  37. receiveはブロックします。実行効率が悪い。もっと実行効率を上げるにはreactを使います。\n通常はアクターにはスレッドが割当てられます。 スレッドはたくさん作るとOutOfMemoryErrorを引き起こします。Javaで学んだようにスレッドをプーリングしてスレッドを再利用しなければなりません。reactはブロックせずに、スレッドを再利用します。ほとんどreceiveと同じことができますが、メッセージを処理しても制御を返しません。カレントスレッドは、次のアクターのために再利用されます。プログラム内のすべてのアクターがreactを使うなら1つのスレッド実行しようとします。ただし、コアの数によります。\n
  38. リソースを共有しないので、メッセージだけで通信していれば、シングルスレッドモデルでよいのです。\n
  39. しかし、落とし穴があってメッセージオブジェクトがmutableだとつらいことになります。とにかくImmutableにしないといろいろ面倒なことを考慮しないと、死にます。\n
  40. \n
  41. 同時複数のスレッドが同じ値を取得し、立て続けに加算した場合想定が崩れる。リードモディファイライトが、、\n
  42. 同時複数のスレッドが同じ値を取得し、立て続けに加算した場合想定が崩れる。リードモディファイライトが、、\n
  43. 結構な頻度でおこります。\n
  44. 同時複数のスレッドが同じ値を取得し、立て続けに加算した場合想定が崩れる。リードモディファイライトが、、\n
  45. \n
  46. 同時複数のスレッドが同じ値を取得し、立て続けに加算した場合想定が崩れる。リードモディファイライトが、、\n
  47. ロックを取得しないでアトミックな操作ができる。実行中のメモリIOを記録し、共有メモリに対しての変更を行う。\nロックがあればスレッド間の調停を行うが、この場合の整合性の検証は書き込み側ではなく、読み込み側に責任がある。トランザクション完了後に読み込み側で、他のスレッドで変更されていないかを検証させる。問題なければコミット、問題あればロールバックされてatomicの式は最初からやり直しになる。\n何がよいのかは、ロックコストを削減と、プログラムがわかりやすくなる。シングルスレッドで考慮すればいいか。デッドロック全く起きないか、トランザクションマネージャによって管理されているので安全です。\n\n