synchronizedのロックコードブロック、方法、およびグローバルロックの詳細な比較


ネット上でsynchronizedについての紹介や使い方の違いをたくさん見ましたが、ほとんどが大同小異で、ポイントまで、個人的にブロガーが書いたものをお勧めします.
Webサイトは次のとおりです.http://blog.csdn.net/cs408/article/details/48930803
このブログはオブジェクトロックとクラスロックの違いを紹介し、分かりやすくしていますが、私のこのブログはこれに基づいて、実際のコードでオブジェクトとクラスの方法、コードセグメントのロックと静的時の対比を分析しています.
まずjavaのsynchronizedロックのいくつかの概念を普及させます:オブジェクトロックとクラスロックの2種類に分けられます.オブジェクトロック(インスタンスロックとも呼ばれる)とは、あるインスタンスオブジェクトにロックされていることを意味する.クラス・ロック(グローバル・ロックとも呼ばれる)は、インスタンスがクラス・オブジェクトの数にかかわらず、クラスに対してロックされます.
一、まずこのような列子で、マルチスレッドのクラスTestSynchronizedを設計し、以下の方法がある.
 
  
class TestSynchronized{
	public synchronized void test_one(){ //       
		System.out.println(Thread.currentThread().getName()+" begin time: "+System.currentTimeMillis());
                //              
		try{
			Thread.sleep(1000); //     1 
		}catch (Exception e) {}
		System.out.println(Thread.currentThread().getName()+"   end time: "+System.currentTimeMillis());
                //              
	}
	public synchronized void test_one_cope(){ //       
		//       ....
	}
        public static synchronized void test_two(){ //      
		//       ....
	}
        public static synchronized void test_two_cope(){ //      
		//       ....
	}
}

, :

Thread thread = new Thread( //         
	new Runnable() {
		public void run() {
			//test(); //   
		}
	}
);
thread.setName("..."); //       ,      

TestSynchronized A B, :

1 A × test_one() A × test_one_cope()
2 A × test_one() B × test_one()
3 A × test_one() A test_two()
4 A test_two() B test_two()
5 A test_two() B test_two_cope()

1. :

a      begin time: 1517142794345
a        end time: 1517142795345
cope_a begin time: 1517142795345
cope_a   end time: 1517142796345

2. :

a  begin time: 1517143258663
b  begin time: 1517143258663
b    end time: 1517143259663
a    end time: 1517143259663

3. :

c  begin time: 1517147555199
a  begin time: 1517147555199
a    end time: 1517147556199
c    end time: 1517147556199

4. :

c  begin time: 1517147900217
c    end time: 1517147901217
d  begin time: 1517147901217
d    end time: 1517147902217

5. :

c       begin time: 1517148173378
c         end time: 1517148174378
cope_d  begin time: 1517148174378
cope_d    end time: 1517148175378

synchronized static synchronized , :

1. , , , 。 , , , 。

2. , , , 。

3. , 。 3 , , 。

, synchronized , synchronized(this){} , , ?

TestSynchronized :

class TestSynchronized{
        //...
	public void test_three(){ //         
		System.out.println(Thread.currentThread().getName()+" begin time: "+System.currentTimeMillis());
                //              
		synchronized (this) {
			System.out.println(Thread.currentThread().getName()+"   now time: "+System.currentTimeMillis());
                        //               
			try{
				Thread.sleep(1000); //     1 
			}catch (Exception e) {}
			System.out.println(Thread.currentThread().getName()+"   end time: "+System.currentTimeMillis());
                        //              
		}
	}
	public void test_three_cope(){ //         
		//       ....
	}
}

6 A test_three() A test_three_cope()
7 A test_three() B test_three()
8 A test_three() A test_one() // ×

6. (synchronized(this)):

e       begin time: 1517148948884
cope_e  begin time: 1517148948884
e         now time: 1517148948884
e         end time: 1517148949884
cope_e    now time: 1517148949884
cope_e    end time: 1517148950884

7. (synchronized(this)):

f  begin time: 1517149480694
e  begin time: 1517149480694
f    now time: 1517149480694
e    now time: 1517149480694
f    end time: 1517149481694
e    end time: 1517149481694

8. , (synchronized(this)):

a begin time: 1517149816536
e begin time: 1517149816536
a   end time: 1517149817536
e   now time: 1517149817536
e   end time: 1517149818536

(synchronized(this)) synchronized method , :

       synchronized methods(){} synchronized(this){} ,synchronized(this){} , , 。 , , 。 8 ,synchronized(this){}) , , 。

      , , 。

      , ? , , , 。

, synchronized(class){} 。

class TestSynchronized{
        //...
	public void test_four(){ //         
		//...
		synchronized (TestSynchronized.class) {
			//...
		}
	}
	public void test_four_cope(){ //         
		//       ....
	}
}
this , synchronized(class){} ? :
9 A test_four() class A test_four_cope() class
10 A test_four() class B test_four() class
11 A test_one() // × A test_four() class
12 A test_two() // × A test_four() class
13 A test_three() this A test_four() class
14 A test_one() // × B test_four() class
15 A test_two() // × B test_four() class
16 A test_three() this B test_four() class

9~12, :

synchronized(class){} , , ,

11 13, , synchronized(class){} , , 。

14~16, , 。

, , , 。

                                                                             Synchronized

                              ( )

                                          ( )

synchronized method(){}

synchronized(this){}

static synchronized method(){}

synchronized(class){}

, , ; 。

, , 。


synchronized , synchronized synchronized sleep yield , synchronized , , 。 sleep 。

synchronized , :

1. , , ?

2. ?

3. 。

synchronized 。