0
0

More than 1 year has passed since last update.

synchronized modifier

Last updated at Posted at 2023-01-23

thread of same instanceを大量発行する

本来
0を読み出し+100
100を読み出し+100
で200となるはずが、

読み出しタイミング同時だと
0を読み出し+100
0を読み出し+100
で100となる

class RunnableSampleClass implements Runnable {
    int num;
    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            Logger.getLogger(RunnableSampleClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        add();
    }
    void add() {
        num = num + 100;
    }
}
public class Outer {
    public static void main(String[] args) {
        ExecutorService e = Executors.newFixedThreadPool(10);
        
        for(int i=0; i<10; i++) {
            RunnableSampleClass r = new RunnableSampleClass();
            e.submit(r);
            e.submit(r);
            try {
                Thread.sleep(200);
            } catch (InterruptedException ex) {
                Logger.getLogger(Outer.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println(r.num);
        }
        e.shutdown();
    }
}
200
200
200
200
200
100
200
100
200
200

排他制御フィールドはRunnableSampleClass。つまりthis。
排他制御対象処理はaddメソッド
synchronizedをつけて、排他制御フィールドをつかめるのは1つのスレッドだけとする。つかめた1スレッドだけが排他制御対象処理を実行。

    synchronized void add() {
        num = num + 100;
    }

結果がすべて200になった。

200
200
200
200
200
200
200
200
200
200
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0