序文
今、『The Art of Java Concurrent Programming』を読み直しています。その中には次のような一節があります。
Java のすべてのオブジェクトはロックとして使用できます。具体的には:
- 通常の同期メソッドの場合、ロックは現在のインスタンス オブジェクトです。
- 静的同期メソッドの場合、ロックは現在のクラスの Class オブジェクトです。
- 同期メソッドブロック、ロックは括弧内に設定されるオブジェクトです。
まだ検証されておらず、今日検証される予定です。
文章
テストコードは非常にシンプルで、文章を出力して5秒間スリープするだけです。3 つの状況に分けて、さまざまなダンプ情報を確認します。
一般的な同期方法
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.helper();
}
public synchronized void helper() {
try {
System.out.println("hello");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結果:
"main" #1 prio=5 os_prio=0 tid=0x00c46800 nid=0x754 waiting on condition [0x0283f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.company.Test.helper(Test.java:16)
- locked <0x04b45e20> (a com.company.Test)
at com.company.Test.main(Test.java:10)
ポイントは次のとおりです: - ロックされた <0x04b45e20> (com.company.Test)
静的同期方式
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.helper();
}
public static synchronized void helper() {
try {
System.out.println("hello");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結果:
"main" #1 prio=5 os_prio=0 tid=0x013d5c00 nid=0x1b28 waiting on condition [0x02edf000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.company.Test.helper(Test.java:14)
- locked <0x05143378> (a java.lang.Class for com.company.Test)
at com.company.Test.main(Test.java:8)
ポイントは次のとおりです: - ロックされた <0x05143378> (com.company.Test の java.lang.Class)
同期ブロック
import java.util.concurrent.TimeUnit;
public class Test {
public static String lock = "";
public static void main(String[] args) {
Test test = new Test();
test.helper();
}
public static void helper() {
synchronized (lock) {
try {
System.out.println("hello");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
結果:
"main" #1 prio=5 os_prio=0 tid=0x01336000 nid=0x258c waiting on condition [0x0164f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.company.Test.helper(Test.java:16)
- locked <0x050095e0> (a java.lang.String)
at com.company.Test.main(Test.java:9)
ポイントは次のとおりです: - ロックされた <0x050095e0> (java.lang.String)
結論は
これら 3 つの例を通して、本の内容を確認できます。
形状 | ロックオブジェクト |
---|---|
同期方法 | com.company.テスト |
静的同期方式 | com.company.Test の java.lang.Class |
静的ブロック (括弧内の文字列オブジェクト) | java.lang.String |