Going my way

いいなと思ったことをメモしていきます。

Javaのマルチスレッドでオブジェクトをロックする方法(オブジェクトをロックするパターン)


Advertisements


前回はメソッドをロックしましたが、今回はオブジェクトをロックしてみましょう。

やっていることは、スレッド①で彼女の名前をセットして、スレッド②で彼女の名前を取得して表示する、という処理です。

スレッド①で彼女のロックを取得しているので、名前をセットしてからsleepで優雅に眠っていても、他のスレッドの彼女オブジェクトを奪われる心配はありません。

スレッド②は待ちきれずに走りだしても、ロックされているオブジェクトにはアクセスできないのです。
現実でもそうですが、目をつけた女の子は早くロックを取得して他の男からアクセスされないようにしましょう。

package thread;

public class TestThread2 {
	public static void main(String[] args){
		final Kanojyo kanojyo = new Kanojyo();
		new Thread(){
			public void run(){
				System.out.println("スレッド-"+Thread.currentThread().getName()+"が走っています");
				
				//彼女pブジェクとのロックを取得する
				synchronized(kanojyo){				
					//sleepしてみる
					try{
						//ロックを取得したので優雅に2秒間待って・・・
						System.out.println(Thread.currentThread().getName()+"は待機中です・・・");
						sleep(2000);
					}catch(InterruptedException e){}
					
					//彼女の名前をセットする
					kanojyo.setKanojyoName("Shiho");
					System.out.println("彼女の名前をセットしました");
				}
			}
		}.start();
		
		new Thread(){
			public void run(){
				try{
					//上で彼女をロックする前にこっちがロックを取得するのは困るので、一瞬待機
					sleep(20);
				} catch(InterruptedException e){}
				System.out.println("スレッド-"+ Thread.currentThread().getName()+"が走っています");
				//いくらスレッドが走っても、ロックを取られているので、setが終わるまでgetKanojyoName()は実行できない
				synchronized(kanojyo){
					System.out.println("彼女の名前は"+kanojyo.getKanojyoName());
				}
			}
		}.start();
	}
}

class Kanojyo{
	private String name = null;
	
	public void setKanojyoName(String name){
		this.name = name;
	}
	
	public String getKanojyoName(){
		return name;
	}
}


実行結果は必ず以下の順番になります。

スレッド-Thread-0が走っています
Thread-0は待機中です・・・
スレッド-Thread-1が走っています
彼女の名前をセットしました
彼女の名前はShiho

ちなみに、私の彼女の名前がShihoというわけではありませんw