java同時プログラミング--Synchronizedの理解

2901 ワード

synchronizedはロックの基礎を実現します。Javaの各オブジェクトはロックとして使用できます。具体的には3つの形で表現されます。
(1)通常の同期方法で、ロックは現在のインスタンスオブジェクトです。
(2)静的同期方法、ロックは現在クラスのクラスのクラスのオブジェクトです。
(3)同期方法ブロック、ロックはSynchronized括弧に配置されているオブジェクトです。
まず普通の同期方法を見てください。
class Sync{
	public synchronized void test(String threadname){
		System.out.println(threadname+"  ");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(threadname+"  ");
	}
}
class MyThread extends Thread{
	public int i;
	public MyThread(int i){
		this.i=i;
	}
	public void run(){		
		Sync sync=new Sync();
		sync.test("Thread"+i);
	}
}
public class SynTest {
    public static void main(String args[]){
    	for(int i=0;i<3;i++){
			Thread thread=new MyThread(i);
			thread.start();
		}
    }
}
結果を実行します
Thread2  
Thread0  
Thread1  
Thread2  
Thread0  
Thread1    
test()はsynchronizedのキーワードを入れましたが、機能しませんでした。これは、Trreadが3つ実例化され、synchronizedがロックされているのは、この3つの実用化対象であり、test()のコードではないからです。なお、他のスレッドは、スレッドがインスタンスオブジェクトをリリースした後にのみ、このインスタンスオブジェクトを使用することができる。
そして静的同期方法を見てください。上のコードを修正します。test()を静的に変更します。
public static synchronized void test(String threadname)
実行結果
Thread1  
Thread1  
Thread0  
Thread0  
Thread2  
Thread2  
今回はsynchronizedのキーワードが効きました。これは静的同期方法のロックが現在のクラスのクラスのクラスのオブジェクト、すなわちSyncクラスのクラスのオブジェクトであるからです。Thread 1が当該オブジェクトを取得してtest()を実行する場合、Thread 0はClassオブジェクトのリリースを待ってからのみ使用できます。 
最後に同期方法ブロックであり、カギは括弧内の設定オブジェクトに依存します。
 
public void test(String threadname){
		synchronized(this){
		System.out.println(threadname+"  ");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(threadname+"  ");
	}
}
使っているロックはthisです。私たちは各スレッドのためにSyncクラスを新たに作ったので、それらは三つの異なるthisです。結果は以下のとおりです
Thread0  
Thread2  
Thread1  
Thread0  
Thread1  
Thread2  
Synchronizedの役割はSyncc.lassオブジェクトをロックとして使うと分かります。同じ時刻にこのセグメントコードを実行するスレッドが一つしかありません。
Thread0  
Thread0  
Thread1  
Thread1  
Thread2  
Thread2  
現在のクラスのクラスのオブジェクトをロックとして使うと、あるセグメントのコードにロックがかけられています。
合併を見ています。メモしてください。参考にしているThisです。 http://blog.csdn.net/xiao__gui/articale/detail/8188833