たけるのプログラミング

作ったものとか、気ままにアップします。

【メモ】synchronized修飾子を復習してみた。【java】

マルチスレッドにおいて、気をつけないといけないことは、


各スレッドが共通したデータ共有を共有している場合です。


この具体例として、オンラインショッピングの在庫処理や銀行の預金処理などを上げることができます。

この記事の銀行の預金の例が分かりやすかったです。
www.atmarkit.co.jp


synchronized修飾子

synchronized修飾子は、マルチスレッドにおいて、共通するデータを操作する際に使用します。
synchronizedメソッドは、そのメソッドが属するインスタンスが複数ある場合は機能しないので、注意しなければいけない。

具体例・ソースコード
//synchronized修飾子

public class Main{
	public static void main(String args[]) {
		count_number c = new count_number();
		multithread1 test1 = new multithread1(c);
		multithread1 test2 = new multithread1(c);
		test1.start();
		test2.start();
	}
}
class count_number{
	private int count=0;
	public  synchronized void plus_count() {
		count++;
		try {
			Thread.sleep(100);
		}catch(InterruptedException e) {}
		System.out.println(count);
	}
}

class multithread1 extends Thread{
	private count_number c;
	public multithread1(count_number c) {
		this.c = c;
	}
	public void run() {
		c.plus_count();
	}
}
説明

スレッドを2つ用意し、2つのスレッドはcount_numberインスタンスを共有しています。実行結果は1 2と表示されますが、もしpulus_count()メソッドにsynchronized修飾子をつけないと結果は2 2となります。
原因はtest1スレッドがcount++し、countが1になり、sleepします。その間にtest2スレッドがcount++し、countの値が2になり、そしてtest1スレッドがprintしようとすると、1ではなく2が表示されます。1 2のように表示したい場合は、メソッドを使えないようにロックする必要があります。