synchronized 修飾子


・・・メソッドにsynchronized修飾子を付けるとそのメソッドは1つのスレッドからしか実行されなくなる。
あるスレッドが実行中に他のスレッドがそのメソッドを呼び出した場合、前のスレッドの処理が終わるまで待機する。


synchronized ブロック

・・・このブロックで指定されたメンバの多重アクセスを防ぐ。



SynchronizedTest.java

package harada;

import java.util.Hashtable;

/*
 * 	synchronizedでHashTableの検索
 */
public class SynchronizedTest {

	protected static Hashtable msgTbl;
	
	public static void main(String[] args) {
	
		System.out.print("Synchonized-");	
		
		msgTbl = new Hashtable();
		
		//HashTableに値をセット
		msgTbl.put ("key_1", "harada");
		msgTbl.put ("key_2", "go");
		msgTbl.put ("key_3", "moji");
		
		System.out.print(" key_3はある?---" + myFind("key_3"));	
		System.out.print(" key_4はある?---" + myFind("key_4"));	
	}
	
	/*
	 * 	HashTableの中にパラメタ findKey のキーが存在するか検索する
	 */
	public synchronized static String myFind(String findKey) {
		
		// msgTbl を他のスレッドからロックする
		synchronized ( msgTbl ) {
			
			//findキーが存在するかチェックする
			if (msgTbl.containsKey(findKey)) {
				return "find→" + msgTbl.get(findKey);
			}
		}
		return "not find";
	}
	
}

上記の例ではmyFindメソッドに synchronized 修飾子がついているため、多重アクセスできない。
また、msgTblを synchronizedブロックのメンバにしているので msgTblも多重アクセスできない。