Java本格入門 Chapter11 スレッドセーフをたしなむ の一部をJavaで実装。
Java本格入門 Chapter11 スレッドセーフをたしなむ の 11-2-3(1)異なるクラスのsynchronizedメソッドは、同期しない。を実装。
書籍の簡略コードではいまいち刺さらなかったので。
実装の参照元ネタ
こちらのサイト様のコードを写経させていただきました。abcdefg..... : Javaでsynchronizedの排他制御を試す
ファイル一覧
- MyMain.java
実装
MyMain.java
public class MyMain {
public static void main(String[] args) {
MyMain aaa = new MyMain();
aaa.test27();
System.out.println("★★★★★");
}
// マルチスレッドでのsyncronized範囲確認
private void test27() {
final class AAA {
public synchronized void func3() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " : ★ start");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " : ★ end");
}
public synchronized void func4() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " : ○ start");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " : ○ end");
}
}
final class BBB {
public synchronized void func3() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " : ★★ start");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " : ★★ end");
}
}
AAA aaa = new AAA();
Runnable r1 = () -> {
try {
aaa.func3();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable r2 = () -> {
try {
aaa.func4();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
BBB bbb = new BBB();
Runnable r3 = () -> {
try {
bbb.func3();
} catch ( InterruptedException e) {
e.printStackTrace();
}
};
new Thread(r1).start();
new Thread(r2).start();
new Thread(r3).start();
}
出力結果
★★★★★ ← main()終了。Thread-2 : ★★ start ← 非同期
Thread-1 : ○ start ← 同期
Thread-2 : ★★ end ← 非同期
Thread-1 : ○ end ← 同期
Thread-0 : ★ start ← 同期
Thread-0 : ★ end ←同期
所感
まぁわかる。いつかこういう教本が、ソース共有だけじゃなくって、オンデマンドなテスト環境とかと連携して、もっと動かしたりできると良いですよね。AngularのStackBlitzみたいな。
コメント
コメントを投稿