synchronizedコードブロックスケジューリング


一、結論


synchronizedキーワードで修飾されたコードブロックは、実行中にスケジューリングされる可能性もあります.すなわち、sysnchronizedで修飾されたコードブロックは、実行が完了してからスケジューリングされるわけではありません.

二、結論検証


1.synchronizedで修飾する2つの文が実行された後にスケジューリングされるrunnableをテストする.
package synchronizedSwitch;

import java.util.concurrent.atomic.AtomicInteger;

public class SwitchedRunnable implements Runnable{

    @Override
    public void run() {
        for(AtomicInteger count = new AtomicInteger(); count.intValue() < 2;){
            synchronized(this){
                // 
                System.out.println(" " + Thread.currentThread().getName() + ", print: " + count.getAndIncrement());
                System.out.println(" " + Thread.currentThread().getName() + ", print: " + count.getAndIncrement());
            }
        }
    }

}

2.mainメインプログラム:1のrunnableで2つのオブジェクトr 1とr 2をそれぞれ作成し、r 1とr 2を使用して2つのスレッドを作成します.
package synchronizedSwitch;

public class SynchronizedSwitch {

    public static void main(String[] args) {
        SwitchedRunnable r1 = new SwitchedRunnable();
        SwitchedRunnable r2 = new SwitchedRunnable();

        Thread [] thread = new Thread[2];
        thread[0] = new Thread(r1, "0");
        thread[1] = new Thread(r2, "1");

        thread[0].start();
        thread[1].start();
    }

}

三、テスト運行結果

 0, print: 0
 1, print: 0
 0, print: 1
 1, print: 1

上記の運転結果から、synchronizedで修飾するコードブロックが実行完了後にスケジューリングされるという結論が成立すると、オンラインスレッド0で数値0が印刷された後も、数値1が印刷され続けるが、実行結果から、スレッド0で数値0が印刷された後、synchronizedで修飾するコードブロックがスケジューリングされ、スレッド1で数値0が印刷され、したがってsynchronizedによって修飾されたコードブロックは、実行が完了してからスケジューリングされるという結論は成立しないため、本博文の冒頭でsysnchronizedによって修飾されたコードブロックは、実行が完了してからスケジューリングされるわけではないという結論が得られる.