【デザインパターン】【非同期】Single Thread Executionパターン

Single Thread Executionパターン

* 難しく考える必要はない
 * この橋を渡れるのは、たった一人(別スレッドが処理が終わるまで待つ)
 * 複数スレッドから同時に実行されたくない場合、
 「synchronized」をつけて、「同時にひとつのスレッドしか実行できない」ように制御する
 * synchronized については、以下の関連記事を参照のこと
https://blogs.yahoo.co.jp/dk521123/33626978.html

サンプル

Main.java

public class Main {
   public static void main(String[] args) {
      Resource resource = new Resource();
      WorkerThread workerThread1 = new WorkerThread(resource);
      WorkerThread workerThread2 = new WorkerThread(resource);
      WorkerThread workerThread3 = new WorkerThread(resource);
      workerThread1.start();
      workerThread2.start();
      workerThread3.start();
  }
}

Resource.java

public class Resource {
   private final static Random random = new Random();

   // ★ポイント★ synchronizedによってスレッドセーフにする
   public synchronized void useResource(int counter) throws InterruptedException {
      print("BEGIN", counter);
      Thread.sleep(Resource.random.nextInt(500));
      print("END", counter);
   }

   private void print(String value, int counter) {
      System.out.println(Thread.currentThread().getName() + " : " + value + " : " + counter);
   }
}

WorkerThread.java

public class WorkerThread extends Thread {
   private final Resource resource;

   public WorkerThread(Resource resource) {
      this.resource = resource;
   }

   @Override
   public void run() {
      for (int i = 0; i < 3; i++) {
         try {
            this.resource.useResource(i);
         } catch (InterruptedException e) {
         }
      }
   }
}

出力結果

Thread-0 : BEGIN : 0
Thread-0 : END : 0
Thread-2 : BEGIN : 0
Thread-2 : END : 0
Thread-2 : BEGIN : 1
Thread-2 : END : 1
Thread-1 : BEGIN : 0
Thread-1 : END : 0
Thread-2 : BEGIN : 2
Thread-2 : END : 2
Thread-0 : BEGIN : 1
Thread-0 : END : 1
Thread-1 : BEGIN : 1
Thread-1 : END : 1
Thread-0 : BEGIN : 2
Thread-0 : END : 2
Thread-1 : BEGIN : 2
Thread-1 : END : 2

補足:synchronizedを外した際の出力結果

Thread-0 : BEGIN : 0
Thread-2 : BEGIN : 0 << ★「Thread-0 : END : 0」が表示する前に、別のスレッドの「BEGIN」が表示されてしまっている
Thread-1 : BEGIN : 0
Thread-0 : END : 0
Thread-0 : BEGIN : 1
Thread-0 : END : 1
Thread-0 : BEGIN : 2
Thread-2 : END : 0
Thread-2 : BEGIN : 1
Thread-2 : END : 1
Thread-2 : BEGIN : 2
Thread-1 : END : 0
Thread-1 : BEGIN : 1
Thread-0 : END : 2
Thread-2 : END : 2
Thread-1 : END : 1
Thread-1 : BEGIN : 2
Thread-1 : END : 2


関連記事

デザインパターン / マルチスレッド の分類 ~目次~

http://blogs.yahoo.co.jp/dk521123/34195603.html

スレッドの排他制御 ~synchronized 文 / volatile 修飾子 / Atomicな変数 ~

https://blogs.yahoo.co.jp/dk521123/33626978.html

ロック・排他制御 について

http://blogs.yahoo.co.jp/dk521123/34348397.html