synchronizedコードブロックスケジューリング
3540 ワード
一、結論
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によって修飾されたコードブロックは、実行が完了してからスケジューリングされるわけではないという結論が得られる.