[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/