Java本格入門 Chapter11 スレッドセーフをたしなむ の一部をJavaで実装。

Java本格入門 Chapter11 スレッドセーフをたしなむ の 11-2-3(1)異なるクラスのsynchronizedメソッドは、同期しない。を実装。

書籍の簡略コードではいまいち刺さらなかったので。

実装の参照元ネタ

こちらのサイト様のコードを写経させていただきました。
abcdefg..... : Javaでsynchronizedの排他制御を試す

ファイル一覧

  1. 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みたいな。

コメント

このブログの人気の投稿

windows10 で nvidia のグラボのcode43現象を解決した

GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019)

Java : processbuilder 標準出力 タイムアウト