「Java」synchronized 使ったサンプル
synchronized 使ったサンプルコード。忘れないようにメモ。
( このスレッド同期周りはどうも苦手で、調べてもすぐ記憶から消えるので備忘録として )
まだまだですが・・・ひとまず「インスタンスが同じか/異なるか」というところですかね。
■ 一つ目 ( synchronized ブロック )
public class ThreadTest extends Thread { // ロック用オブジェクト static Object lock = new Object(); public void run() { testMethod(); } private void testMethod() { synchronized (lock) { for (int i = 1; i <= 5; i++) { System.out.println(this.getName() + ":" + i); try { sleep(100); } catch (InterruptedException e) { } } } } public static void main(String[] args) { new ThreadTest().start(); new ThreadTest().start(); } }
※ 以下のようにしちゃうと ThreadTest インスタンスが異なるので同期できない。
public class ThreadTest extends Thread { public void run() { testMethod(); } private synchronized void testMethod() { for (int i = 1; i <= 5; i++) { System.out.println(this.getName() + ":" + i); try { sleep(100); } catch (InterruptedException e) { } } } public static void main(String[] args) { new ThreadTest().start(); new ThreadTest().start(); } }
■ 二つ目 ( synchronized メソッド )
public class ThreadTest extends Thread { static TestClass tc = new TestClass(); public void run() { tc.testMethod(); } public static void main(String[] args) { new ThreadTest().start(); new ThreadTest().start(); } } class TestClass { public synchronized void testMethod() { for (int i = 1; i <= 5; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { } } } }