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

ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」inspirehighstaff03
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」inspirehighstaff03
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」inspirehighstaff03
 
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」inspirehighstaff03
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfinspirehighstaff03
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」inspirehighstaff03
 
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」inspirehighstaff03
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」inspirehighstaff03
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」inspirehighstaff03
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」inspirehighstaff03
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」inspirehighstaff03
 

Recently uploaded (20)

ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
 
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」My Inspire High Award 2024 「AIと仲良くなるには?」
My Inspire High Award 2024 「AIと仲良くなるには?」
 
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
My Inspire High Award 2024「なぜ、好きなことにいつかは飽きるの」
 
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
My Inspire High Award 2024「なぜ人は他人と違うところがあってもそれをなかなか誇れないのか?」
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」My Inspire High Award 2024「老いることは不幸なこと?」
My Inspire High Award 2024「老いることは不幸なこと?」
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
 

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