SlideShare a Scribd company logo
1 of 46
Java 並行処理の基礎 update 1
@hakurai

2021/08/28
Java 並行処理入門 update 1
@hakurai

2021/08/28
自己紹介



✤   twitter: hakurai

✤   Javaとか

✤   JavaFX!JavaFX!
Java言語仕様 イントロダクションより




✤   プログラミング言語Javaは、並行処理の可能なクラスに基づく汎用目
    的のオブジェクト指向言語です。
Java言語仕様 イントロダクションより




✤   プログラミング言語Javaは、並行処理の可能なクラスに基づく汎用目
    的のオブジェクト指向言語です。
言語仕様レベルで並行処理をサポート




✤   synchronized

✤   volatile

✤   final
Java仮想マシンで何が行われるかという
基礎的なおはなし
まずは変数とメモリについて
変数について


✤   変数とは記憶領域のこと     変数1
                    変数2
✤   Javaの変数は型を持つ    変数3

✤   プリミティブ型
✤   参照型
    ✤   クラス型
    ✤   インターフェイス型
    ✤   配列型
✤   null型
メイン・メモリと作業メモリ




✤   変数は、すべてのスレッドから共有されるメイン・メモリ中に保持さ
    れる。

✤   すべてのスレッドには作業メモリという、スレッドによって使用や代
    入が行われる変数の作業コピーを保持する領域が用意される。



                      Java仮想マシン仕様 第2版 359Pより
スレッドは作業メモリを利用する

スレッド1      スレッド2
実行エンジン     実行エンジン



 変数A           変数A

               変数B


                     作業メモリ




変数A      変数B
                     メイン・メモリ
変数C      変数D
変数は作業メモリに転送される

スレッド1      スレッド2
                     ✤   メイン・メモリから変数が作業メモリ
実行エンジン     実行エンジン
                         に転送される
 変数A
   100
               変数B




変数A      変数B
  100
変数C      変数D
スレッド1上で変数Aに値を代入すると

スレッド1      スレッド2
                     ✤   スレッド1の作業エンジンが変数Aに
実行エンジン     実行エンジン
                         200を代入する
 変数A
   200
               変数B
                     ✤   Java仮想マシンの仕様上メイン・メモ
                         リに書き込むタイミングは自由




変数A      変数B
  100
変数C      変数D
この状態でスレッド2が変数Aを読み込むと

スレッド1      スレッド2
                       ✤   スレッド2の作業メモリ上の変数Aは古
実行エンジン     実行エンジン
                           いまま
 変数A           変数A
   200           100
               変数B
                       ✤   スレッド2からは変数Aの値が100に見
                           える




変数A      変数B
  100
変数C      変数D
変数の一貫性を保つ必要がある

            変数A    変数A
             200    200
                   変数B
synchronized & volatile
synchronizedの役割(相互排除)


✤   すべてのオブジェクトにはモニタが存在する

✤   モニタを取得してオブジェクトをロックするのがsynchronized

✤   同時にモニタを取得できるのは一つのスレッドだけ

✤   オブジェクトのロックを取得できたスレッドのみ処理を実行させる

✤   synchronized文を抜けるとロックは自動的に解放される
メモリの可視性に関する規則
ロックと変数(メモリの可視性)



✤   スレッドが任意のロックに対してアンロックを実行する場合、最初に
    その作業メモリ中のすべての代入値をメイン・メモリにコピーしてお
    かなければならない

✤   ロックは、スレッドの作業メモリからすべての変数をフラッシュする
    かのように振る舞う



                      Java仮想マシン仕様 第2版 364Pより
ロックと変数に関する規則1



✤   変数のスレッドに対する代入と、それに続くアンロックの間には、必
    ずストアが介在し、更にそのストアに対応する書き込みは、必ずアン
    ロックに先立って行わなければならない

✤   つまり、作業メモリ内で変更された変数はアンロック前にメイン・メ
    モリへのコピーが完了していなければならない
ロックと変数に関する規則2


✤   任意のロックLに対するスレッドTによるロックLと、それに続く変数Vに対するスレッ
    ドTによる使用やストアの間には、必ず変数Vに対する代入やロードが介在する


✤   さらにロード時には、メイン・メモリからみた場合、そのロードに対する読み込み
    は、必ずロックの後に行わなければならない。


✤   つまり、ロック後に使用する変数は、使用する前にメイン・メモリからロードされな
    ければならない


✤   もしくは、代入によって変数を上書きする
ロックで変数の一貫性を保つことができる
ロックの例

✤   モニタの解放後に他のスレッドから最新の値が見えることを保証する


        private final Object lock = new Object();
        private List<String> list;

        private String get(int index){
           synchronized (lock){
              return list.get(index);
           }
        }
ダメな例

       private final Object lock = new Object();
       private List<String> list;

       public void add(String text){
         synchronized (lock){
             list.add(text);
         }
       }

       public String get(int index){
             return list.get(index);
       }
ダメな例

       private final Object lock = new Object();
       private List<String> list;

       public void add(String text){
         synchronized (lock){
             list.add(text);
         }
       }

       public String get(int index){
             return list.get(index);
       }
                                  陳腐化したデータ
ダメな例

       private final Object lock = new Object();
       private List<String> list;

        public void add(String text){
            synchronized (lock){
   最新の状態のlistが見えることを保証していない
               list.add(text);
   ・予期しない値が返される
            }
   ・IllegalArgumentException
        }

       public String get(int index){
             return list.get(index);
       }
                                  陳腐化したデータ
アンロックが実行されると

スレッド1      スレッド2
                       ✤   メイン・メモリの変数Aの値は200に更
実行エンジン     実行エンジン
                           新される
 変数A           変数A
  200            100
               変数B




変数A      変数B
 200
変数C      変数D
ロックが実行されると

スレッド1      スレッド2
                      ✤   スレッド2の作業メモリの変数Aの値は
実行エンジン     実行エンジン
                          200に更新される
 変数A           変数A
  200           200
               変数B




変数A      変数B
 200
変数C      変数D
変数の一貫性の保たれるコード

public class Test {

    private int a;

    public synchronized int getA() {
      return a;
    }

    public synchronized void setA(int a) {
      this.a = a;
    }

}
volatileの役割



✤   フィールドをvolatileとして宣言することによって、Javaのメモリ・モ
    デルはすべてのスレッドから見てその変数の値の整合性が保たれるこ
    とを保証する




                            Java言語仕様 第3版 177Pより
volatile変数に対する規則



✤   変数がvolatileとして宣言されている場合、各スレッドの動作に次の
    制約が追加される

✤   変数Vに対するスレッドTによる使用は、変数Vに対するスレッドTに
    よる以前の動作がロードである場合にのみ許される

✤   変数Vに対するスレッドTによるロードは、変数Vに対するスレッドT
    による次の動作が使用である場合にのみ許される

                         Java仮想マシン仕様 第2版 364Pより
つまりvolatile変数は使用される前に
メイン・メモリから最新の値がコピーされる
volatile変数の使用

スレッド1      スレッド2
                      ✤   使用される前にメイン・メモリから最
実行エンジン     実行エンジン
                          新の値がコピーされる
 変数A           変数A
   200          200
               変数B




 変数A     変数B
  200
 変数C     変数D
volatile変数の代入

スレッド1       スレッド2
                        ✤   代入された直後に最新の値がメイン・
実行エンジン      実行エンジン
                            メモリにコピーされる
  変数A           変数A
    200           100
                変数B




 変数A      変数B
   200
 変数C      変数D
すべてのスレッドから
変数の最新の値を見ることができる
リオーダーの禁止

✤   非volatile変数の読み書きとの順序替え(reordering)の禁止


          private int num = 0;
          private volatile boolean initialized;

          public void run(){
            num = 100;
            initialized = true;
          }
finalフィールド



✤   finalフィールドによって、プログラマは同期化を用いることなく、ス
    レッド・セーフな不変オブジェクトを実装できるようになる

✤   生成中のオブジェクトへの参照は、該当オブジェクトのコンストラク
    タが完了する前に他のスレッドから観測される場所に書き込んではい
    けない



                         Java言語仕様 第3版 500Pより
不変クラスの例
 public final class Test {
   private String text;
   private List<Integer> integerList;

     public Test(String text, List<Integer> integerList) {
       this.text = text;
       this.integerList = new ArrayList<>(integerList);
     }

     public String getText() {
       return text;
     }

     public List<Integer> getIntegerList() {
       return new ArrayList<>(integerList);
     }
 }
不変クラスの例??
 public final class Test {
   private String text;
   private List<Integer> integerList;

     public Test(String text, List<Integer> integerList) {
       this.text = text;
       this.integerList = new ArrayList<>(integerList);
     }

     public String getText() {
       return text;
     }

     public List<Integer> getIntegerList() {
       return new ArrayList<>(integerList);
     }
 }
不変クラスの(ダメな)例
  public final class Test {
    private String text;
    private List<Integer> integerList;

      public Test(String text, List<Integer> integerList) {
        this.text = text;
        this.integerList = new ArrayList<>(integerList);
      }

      public String getText() {
        return text;
      }

      public List<Integer> getIntegerList() {
        return new ArrayList<>(integerList);
      }
  }
不変クラスの作成ガイドライン

✤   すべてのフィールドがfinalである
✤   クラスがfinalとして宣言されている
✤   作成時にthis 参照がコンストラクター外部に渡されない
✤   配列、コレクションなどの可変オブジェクトや、Date などの可変クラスへの参照を含
    むフィールドが以下の条件を満たす
✤   privateである
✤   返されないか、呼び出し側に公開されない
✤   参照の対象となるオブジェクトへの唯一の参照である
✤   参照するオブジェクトの状態を、そのオブジェクトが作成された後で変更しない



                                             Javaの理論と実践: 可変性か、不変性か?
         http://www.ibm.com/developerworks/jp/java/library/j-jtp02183/index.html
不変クラスの(ダメな)例
  public final class Test {
    private String text;
    private List<Integer> integerList;

      public Test(String text, List<Integer> integerList) {
        this.text = text;
        this.integerList = new ArrayList<>(integerList);
      }

      public String getText() {
        return text;
      }

      public List<Integer> getIntegerList() {
        return new ArrayList<>(integerList);
      }
  }
不変クラスの(ダメな)例
  public final class Test {
    private String text;
    private List<Integer> integerList;

      public Test(String text, List<Integer> integerList) {
        this.text = text;
        this.integerList = new ArrayList<>(integerList);
      }

      public String getText() { nullの可能性がある
        return text;
      }

      public List<Integer> getIntegerList() {
        return new ArrayList<>(integerList);
      }
  }
不変クラスの(ダメな)例
  public final class Test {
    private String text;
    private List<Integer> integerList;

      public Test(String text, List<Integer> integerList) {
        this.text = text;
        this.integerList = new ArrayList<>(integerList);
      }

      public String getText() { nullの可能性がある
        return text;
      }

      public List<Integer> getIntegerList() {     例外が発生する可能性
        return new ArrayList<>(integerList);
      }                                                       がある
  }
不変クラスの(正しい)例
  public final class Test {
    private final String text;
    private final List<Integer> integerList;

      public Test(String text, List<Integer> integerList) {
        this.text = text;
        this.integerList = new ArrayList<>(integerList);
      }

      public String getText() {
        return text;
      }

      public List<Integer> getIntegerList() {
        return new ArrayList<>(integerList);
      }
  }
並行処理難しい!

More Related Content

What's hot

Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java心 谷本
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Uehara Junji
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionTakuto Wada
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!Akihiro Nishimura
 
SQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのかSQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのかyancya
 
SQLQL とは!?
SQLQL とは!?SQLQL とは!?
SQLQL とは!?yancya
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 

What's hot (17)

Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Flow.js
Flow.jsFlow.js
Flow.js
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
SQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのかSQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのか
 
SQLQL とは!?
SQLQL とは!?SQLQL とは!?
SQLQL とは!?
 
Xtext&Xtend documents
Xtext&Xtend documentsXtext&Xtend documents
Xtext&Xtend documents
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 

Viewers also liked

Java並行処理プログラミング 第16章ver2
Java並行処理プログラミング 第16章ver2Java並行処理プログラミング 第16章ver2
Java並行処理プログラミング 第16章ver2Takinami Kei
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
プログラマがデザインをがんばってみた
プログラマがデザインをがんばってみたプログラマがデザインをがんばってみた
プログラマがデザインをがんばってみただいすけ ふるかわ
 
ノンデザイナーのためのWebデザイン講座
ノンデザイナーのためのWebデザイン講座ノンデザイナーのためのWebデザイン講座
ノンデザイナーのためのWebデザイン講座光利 吉田
 
プログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみたプログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみたEigoro Yamamura
 
Original apple business plan
Original apple business planOriginal apple business plan
Original apple business planakdiamond
 
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜Ayaka Sumida
 
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえようノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえようSasaki Kouhei
 
Webデザインのトーン&マナーを導き出す手法
Webデザインのトーン&マナーを導き出す手法Webデザインのトーン&マナーを導き出す手法
Webデザインのトーン&マナーを導き出す手法Katsumi Tazuke
 
デザインのためのデザイン
デザインのためのデザインデザインのためのデザイン
デザインのためのデザインMasayuki Uetani
 
ノンデザイナーのための配色理論
ノンデザイナーのための配色理論ノンデザイナーのための配色理論
ノンデザイナーのための配色理論tsukasa obara
 
Webデザインのセオリーを学ぼう
Webデザインのセオリーを学ぼうWebデザインのセオリーを学ぼう
Webデザインのセオリーを学ぼうToshiaki Sasaki
 
Apple Inc Presentatioin
Apple Inc PresentatioinApple Inc Presentatioin
Apple Inc Presentatioin2AM
 
色彩センスのいらない配色講座
色彩センスのいらない配色講座色彩センスのいらない配色講座
色彩センスのいらない配色講座Mariko Yamaguchi
 

Viewers also liked (16)

Java並行処理プログラミング 第16章ver2
Java並行処理プログラミング 第16章ver2Java並行処理プログラミング 第16章ver2
Java並行処理プログラミング 第16章ver2
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Web design
Web designWeb design
Web design
 
プログラマがデザインをがんばってみた
プログラマがデザインをがんばってみたプログラマがデザインをがんばってみた
プログラマがデザインをがんばってみた
 
ノンデザイナーのためのWebデザイン講座
ノンデザイナーのためのWebデザイン講座ノンデザイナーのためのWebデザイン講座
ノンデザイナーのためのWebデザイン講座
 
プログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみたプログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみた
 
Original apple business plan
Original apple business planOriginal apple business plan
Original apple business plan
 
Facebook For Business
Facebook For BusinessFacebook For Business
Facebook For Business
 
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
 
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえようノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
 
Webデザインのトーン&マナーを導き出す手法
Webデザインのトーン&マナーを導き出す手法Webデザインのトーン&マナーを導き出す手法
Webデザインのトーン&マナーを導き出す手法
 
デザインのためのデザイン
デザインのためのデザインデザインのためのデザイン
デザインのためのデザイン
 
ノンデザイナーのための配色理論
ノンデザイナーのための配色理論ノンデザイナーのための配色理論
ノンデザイナーのための配色理論
 
Webデザインのセオリーを学ぼう
Webデザインのセオリーを学ぼうWebデザインのセオリーを学ぼう
Webデザインのセオリーを学ぼう
 
Apple Inc Presentatioin
Apple Inc PresentatioinApple Inc Presentatioin
Apple Inc Presentatioin
 
色彩センスのいらない配色講座
色彩センスのいらない配色講座色彩センスのいらない配色講座
色彩センスのいらない配色講座
 

Similar to Java 並行処理の基礎update1

Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravelRisa Ohnishi
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料gaaupp
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へonozaty
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehimeEigoro Yamamura
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 

Similar to Java 並行処理の基礎update1 (20)

Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
Project lambda
Project lambdaProject lambda
Project lambda
 
Junit4
Junit4Junit4
Junit4
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
Akka Unit Testing
Akka Unit TestingAkka Unit Testing
Akka Unit Testing
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へ
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
Project coin
Project coinProject coin
Project coin
 
Introduction Xtend
Introduction XtendIntroduction Xtend
Introduction Xtend
 
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehime
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
Spring AMQP × RabbitMQ
Spring AMQP × RabbitMQSpring AMQP × RabbitMQ
Spring AMQP × RabbitMQ
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 

More from Kazuhiro Eguchi

なれる!クラスローダー
なれる!クラスローダーなれる!クラスローダー
なれる!クラスローダーKazuhiro Eguchi
 
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~Kazuhiro Eguchi
 
Automate the Swing application testing
Automate the Swing application testingAutomate the Swing application testing
Automate the Swing application testingKazuhiro Eguchi
 

More from Kazuhiro Eguchi (8)

Haxe
HaxeHaxe
Haxe
 
JavaFX8
JavaFX8JavaFX8
JavaFX8
 
実践Knockout
実践Knockout実践Knockout
実践Knockout
 
なれる!クラスローダー
なれる!クラスローダーなれる!クラスローダー
なれる!クラスローダー
 
Knockout
KnockoutKnockout
Knockout
 
Starting java fx
Starting java fxStarting java fx
Starting java fx
 
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
並行処理プログラミングの深淵~Java仮想マシン仕様 スレッドとロック~
 
Automate the Swing application testing
Automate the Swing application testingAutomate the Swing application testing
Automate the Swing application testing
 

Recently uploaded

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 

Recently uploaded (7)

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 

Java 並行処理の基礎update1

  • 1. Java 並行処理の基礎 update 1 @hakurai 2021/08/28
  • 2. Java 並行処理入門 update 1 @hakurai 2021/08/28
  • 3. 自己紹介 ✤ twitter: hakurai ✤ Javaとか ✤ JavaFX!JavaFX!
  • 4. Java言語仕様 イントロダクションより ✤ プログラミング言語Javaは、並行処理の可能なクラスに基づく汎用目 的のオブジェクト指向言語です。
  • 5. Java言語仕様 イントロダクションより ✤ プログラミング言語Javaは、並行処理の可能なクラスに基づく汎用目 的のオブジェクト指向言語です。
  • 6. 言語仕様レベルで並行処理をサポート ✤ synchronized ✤ volatile ✤ final
  • 9. 変数について ✤ 変数とは記憶領域のこと 変数1 変数2 ✤ Javaの変数は型を持つ 変数3 ✤ プリミティブ型 ✤ 参照型 ✤ クラス型 ✤ インターフェイス型 ✤ 配列型 ✤ null型
  • 10. メイン・メモリと作業メモリ ✤ 変数は、すべてのスレッドから共有されるメイン・メモリ中に保持さ れる。 ✤ すべてのスレッドには作業メモリという、スレッドによって使用や代 入が行われる変数の作業コピーを保持する領域が用意される。 Java仮想マシン仕様 第2版 359Pより
  • 11. スレッドは作業メモリを利用する スレッド1 スレッド2 実行エンジン 実行エンジン 変数A 変数A 変数B 作業メモリ 変数A 変数B メイン・メモリ 変数C 変数D
  • 12. 変数は作業メモリに転送される スレッド1 スレッド2 ✤ メイン・メモリから変数が作業メモリ 実行エンジン 実行エンジン に転送される 変数A 100 変数B 変数A 変数B 100 変数C 変数D
  • 13. スレッド1上で変数Aに値を代入すると スレッド1 スレッド2 ✤ スレッド1の作業エンジンが変数Aに 実行エンジン 実行エンジン 200を代入する 変数A 200 変数B ✤ Java仮想マシンの仕様上メイン・メモ リに書き込むタイミングは自由 変数A 変数B 100 変数C 変数D
  • 14. この状態でスレッド2が変数Aを読み込むと スレッド1 スレッド2 ✤ スレッド2の作業メモリ上の変数Aは古 実行エンジン 実行エンジン いまま 変数A 変数A 200 100 変数B ✤ スレッド2からは変数Aの値が100に見 える 変数A 変数B 100 変数C 変数D
  • 15. 変数の一貫性を保つ必要がある 変数A 変数A 200 200 変数B
  • 17. synchronizedの役割(相互排除) ✤ すべてのオブジェクトにはモニタが存在する ✤ モニタを取得してオブジェクトをロックするのがsynchronized ✤ 同時にモニタを取得できるのは一つのスレッドだけ ✤ オブジェクトのロックを取得できたスレッドのみ処理を実行させる ✤ synchronized文を抜けるとロックは自動的に解放される
  • 19. ロックと変数(メモリの可視性) ✤ スレッドが任意のロックに対してアンロックを実行する場合、最初に その作業メモリ中のすべての代入値をメイン・メモリにコピーしてお かなければならない ✤ ロックは、スレッドの作業メモリからすべての変数をフラッシュする かのように振る舞う Java仮想マシン仕様 第2版 364Pより
  • 20. ロックと変数に関する規則1 ✤ 変数のスレッドに対する代入と、それに続くアンロックの間には、必 ずストアが介在し、更にそのストアに対応する書き込みは、必ずアン ロックに先立って行わなければならない ✤ つまり、作業メモリ内で変更された変数はアンロック前にメイン・メ モリへのコピーが完了していなければならない
  • 21. ロックと変数に関する規則2 ✤ 任意のロックLに対するスレッドTによるロックLと、それに続く変数Vに対するスレッ ドTによる使用やストアの間には、必ず変数Vに対する代入やロードが介在する ✤ さらにロード時には、メイン・メモリからみた場合、そのロードに対する読み込み は、必ずロックの後に行わなければならない。 ✤ つまり、ロック後に使用する変数は、使用する前にメイン・メモリからロードされな ければならない ✤ もしくは、代入によって変数を上書きする
  • 23. ロックの例 ✤ モニタの解放後に他のスレッドから最新の値が見えることを保証する private final Object lock = new Object(); private List<String> list; private String get(int index){ synchronized (lock){ return list.get(index); } }
  • 24. ダメな例 private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ list.add(text); } } public String get(int index){ return list.get(index); }
  • 25. ダメな例 private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ list.add(text); } } public String get(int index){ return list.get(index); } 陳腐化したデータ
  • 26. ダメな例 private final Object lock = new Object(); private List<String> list; public void add(String text){ synchronized (lock){ 最新の状態のlistが見えることを保証していない list.add(text); ・予期しない値が返される } ・IllegalArgumentException } public String get(int index){ return list.get(index); } 陳腐化したデータ
  • 27. アンロックが実行されると スレッド1 スレッド2 ✤ メイン・メモリの変数Aの値は200に更 実行エンジン 実行エンジン 新される 変数A 変数A 200 100 変数B 変数A 変数B 200 変数C 変数D
  • 28. ロックが実行されると スレッド1 スレッド2 ✤ スレッド2の作業メモリの変数Aの値は 実行エンジン 実行エンジン 200に更新される 変数A 変数A 200 200 変数B 変数A 変数B 200 変数C 変数D
  • 29. 変数の一貫性の保たれるコード public class Test { private int a; public synchronized int getA() { return a; } public synchronized void setA(int a) { this.a = a; } }
  • 30. volatileの役割 ✤ フィールドをvolatileとして宣言することによって、Javaのメモリ・モ デルはすべてのスレッドから見てその変数の値の整合性が保たれるこ とを保証する Java言語仕様 第3版 177Pより
  • 31. volatile変数に対する規則 ✤ 変数がvolatileとして宣言されている場合、各スレッドの動作に次の 制約が追加される ✤ 変数Vに対するスレッドTによる使用は、変数Vに対するスレッドTに よる以前の動作がロードである場合にのみ許される ✤ 変数Vに対するスレッドTによるロードは、変数Vに対するスレッドT による次の動作が使用である場合にのみ許される Java仮想マシン仕様 第2版 364Pより
  • 33. volatile変数の使用 スレッド1 スレッド2 ✤ 使用される前にメイン・メモリから最 実行エンジン 実行エンジン 新の値がコピーされる 変数A 変数A 200 200 変数B 変数A 変数B 200 変数C 変数D
  • 34. volatile変数の代入 スレッド1 スレッド2 ✤ 代入された直後に最新の値がメイン・ 実行エンジン 実行エンジン メモリにコピーされる 変数A 変数A 200 100 変数B 変数A 変数B 200 変数C 変数D
  • 36. リオーダーの禁止 ✤ 非volatile変数の読み書きとの順序替え(reordering)の禁止 private int num = 0; private volatile boolean initialized; public void run(){ num = 100; initialized = true; }
  • 37. finalフィールド ✤ finalフィールドによって、プログラマは同期化を用いることなく、ス レッド・セーフな不変オブジェクトを実装できるようになる ✤ 生成中のオブジェクトへの参照は、該当オブジェクトのコンストラク タが完了する前に他のスレッドから観測される場所に書き込んではい けない Java言語仕様 第3版 500Pより
  • 38. 不変クラスの例 public final class Test { private String text; private List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { return text; } public List<Integer> getIntegerList() { return new ArrayList<>(integerList); } }
  • 39. 不変クラスの例?? public final class Test { private String text; private List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { return text; } public List<Integer> getIntegerList() { return new ArrayList<>(integerList); } }
  • 40. 不変クラスの(ダメな)例 public final class Test { private String text; private List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { return text; } public List<Integer> getIntegerList() { return new ArrayList<>(integerList); } }
  • 41. 不変クラスの作成ガイドライン ✤ すべてのフィールドがfinalである ✤ クラスがfinalとして宣言されている ✤ 作成時にthis 参照がコンストラクター外部に渡されない ✤ 配列、コレクションなどの可変オブジェクトや、Date などの可変クラスへの参照を含 むフィールドが以下の条件を満たす ✤ privateである ✤ 返されないか、呼び出し側に公開されない ✤ 参照の対象となるオブジェクトへの唯一の参照である ✤ 参照するオブジェクトの状態を、そのオブジェクトが作成された後で変更しない Javaの理論と実践: 可変性か、不変性か? http://www.ibm.com/developerworks/jp/java/library/j-jtp02183/index.html
  • 42. 不変クラスの(ダメな)例 public final class Test { private String text; private List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { return text; } public List<Integer> getIntegerList() { return new ArrayList<>(integerList); } }
  • 43. 不変クラスの(ダメな)例 public final class Test { private String text; private List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { nullの可能性がある return text; } public List<Integer> getIntegerList() { return new ArrayList<>(integerList); } }
  • 44. 不変クラスの(ダメな)例 public final class Test { private String text; private List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { nullの可能性がある return text; } public List<Integer> getIntegerList() { 例外が発生する可能性 return new ArrayList<>(integerList); } がある }
  • 45. 不変クラスの(正しい)例 public final class Test { private final String text; private final List<Integer> integerList; public Test(String text, List<Integer> integerList) { this.text = text; this.integerList = new ArrayList<>(integerList); } public String getText() { return text; } public List<Integer> getIntegerList() { return new ArrayList<>(integerList); } }

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n