[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1442] 読書会で出た疑問 ( クラスメソッドの synchronized は?)



高橋(徹)です。

読書会参加された方お疲れ様でした。
今回参加できなかった方も、是非次回参加ください。途中でも全然問題ないです。
今回は43ページ(第1章の半分、全体の1/10)までしか進みませんでした。この
ペースでは、10回かかるかもしれません(^^;

読書会ででた疑問点の1つ、クラスメソッドでsynchronizedを使ったら
なにがロックされるのか?
Java言語仕様にちゃんと記述がありました。該当部分を下記に引用します。

「Java言語仕様」村上章訳、発行:アジソン・ウェスレイ・パブリッシャーズ・
ジャパン、発売:星雲社、1997 から抜粋

 8.4.3.5 synchronizedメソッド
 synchronizedメソッドは、その実行に先立ってロック(§17.1)を獲得する。
 クラス(static)メソッドの場合は、メソッドのクラスに対するClassオブジェクト
 (§20.3)と対応付けられたロックを使用する。インスタンス・メソッドの場合は、
 this(メソッドが呼び出されたオブジェクト)と対応付けられたロックを使用する。
 これらは、synchronized文(§14.7)で使用するロックと同一のものである。つまり、
    class Test {
        int count;
        synchronized void bump() { count++; }
        static int classCount;
        static synchronized void classBump() {
            classCount++;
        }
    }
 このコードは、以下と同一の効果がある。
    class BumpTest {
        int count;
        void bump() {
            synchronized (this) {
                count++;
            }
        }
        static int classCount;
        static void classBump() {
            try {
                synchronized (Class.forName("BumpTest")) {
                   classCount++;
                }
            } catch (ClassNotFoundException e) {
                ...
            }
        }
    }

--
Toru TAKAHASHI <torutk@xxxxxxxxxxx>
http://www.alles.or.jp/~torutk/