「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) { }
		}
	}
}