最初のスレッドが待ち続けるということはなさそう。
適当に開放されるみたい。法則はちゃんとあるけど。
とりあえず試せるソース
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の場合は後から来た順にトンネル
特急トンネル待ち 特急トンネル 急行トンネル待ち 快速トンネル待ち 普通トンネル待ち 普通トンネル 快速トンネル 急行トンネル
なんだか、細かいところで動きが変わってることが多そうです。
あと、↓のようなこともあるようです。