JDK6のsynchronizedの開放順の続き

最初のスレッドが待ち続けるということはなさそう。
適当に開放されるみたい。法則はちゃんとあるけど。


とりあえず試せるソース

public class ThreadTest implements Runnable{

    private String name;
    private long speed;

    ThreadTest(long speed, String name){
        this.speed = speed;
        this.name = name;
    }

    public void run() {
        try {
            Thread.sleep(speed);
            System.out.println(name + "トンネル待ち");
            synchronized (ThreadTest.class){
                System.out.println(name + "トンネル");
                Thread.sleep(200);
            }
        } catch (InterruptedException ex) {
        }
    }
    
    public static void main(String[] args) {
        new Thread(new ThreadTest(100, "特急")).start();
        new Thread(new ThreadTest(130, "急行")).start();
        new Thread(new ThreadTest(160, "快速")).start();
        new Thread(new ThreadTest(200, "普通")).start();
    }
}


JDK5の場合は待った順にトンネル。

特急トンネル待ち
特急トンネル
急行トンネル待ち
快速トンネル待ち
普通トンネル待ち
急行トンネル
快速トンネル
普通トンネル


JDK6の場合は後から来た順にトンネル

特急トンネル待ち
特急トンネル
急行トンネル待ち
快速トンネル待ち
普通トンネル待ち
普通トンネル
快速トンネル
急行トンネル


なんだか、細かいところで動きが変わってることが多そうです。
あと、↓のようなこともあるようです。