«前の日記(2007-01-17) 最新 次の日記(2007-01-19)» 編集

会長@腹部日記


2007-01-18 [長年日記]

_ 仕事の息抜きに見つけたJDK6の話

JDK6はsynchronizedの開放順が変わってる

というのを見つけました。

確かめられるかなー

と思い、書いてみました*1

public class Main {

   static Object o = new Object();

   public static void main(String[] args) {
       Main m = new Main();
       for(int i = 1; i < 10; i++)m.new T(String.valueOf(i)).start();
   }

   class T extends Thread{
       public T(String name){
           setName(name);
       }

       public void run(){
           synchronized (o) {
               String tName = Thread.currentThread().getName();
               System.out.print("#sync -" + tName + "-");
               try{
                   if(Thread.currentThread().getName().equals("1"))sleep(3000);
               }catch(Exception e){}
               System.out.println("=" + tName + "=> end");
           }
       }
   }
}

PentiumMのマシンだと

見事な結果。

JDK1.6.0
#sync -1-=1=> end
#sync -9-=9=> end
#sync -8-=8=> end
#sync -7-=7=> end
#sync -6-=6=> end
#sync -5-=5=> end
#sync -4-=4=> end
#sync -3-=3=> end
#sync -2-=2=> end
JDK1.5.0_10
#sync -1-=1=> end
#sync -2-=2=> end
#sync -3-=3=> end
#sync -4-=4=> end
#sync -5-=5=> end
#sync -6-=6=> end
#sync -7-=7=> end
#sync -8-=8=> end
#sync -9-=9=> end

Core2Duoだと

やはり実行するたびに、ばらばらでした。

う〜ん

仕様というのか何なのか・・・でもそんな記述は載ってないわけで。ロックの開放順をアテにしたようなコードなんぞそうそう無いとは思いますが(‾ー‾)

追記

こんなドキュメントが見つかりました。

http://www-06.ibm.com/jp/developerworks/java/041112/j_j-jtp10264.html http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/concurrent/locks/ReentrantLock.html

仕事で1.5はまだ使わないえない・・・(´;ω;`)ぶわっ

*1 確かめられるコードかどうかあまり自信はない・・・