同期されたロックされたオブジェクト

序文

今、『The Art of Java Concurrent Programming』を読み直しています。その中には次のような一節があります。

Java のすべてのオブジェクトはロックとして使用できます。具体的には:

  • 通常の同期メソッドの場合、ロックは現在のインスタンス オブジェクトです。
  • 静的同期メソッドの場合、ロックは現在のクラスの Class オブジェクトです。
  • 同期メソッドブロック、ロックは括弧内に設定されるオブジェクトです。

まだ検証されておらず、今日検証される予定です。

文章

テストコードは非常にシンプルで、文章を出力して5秒間スリープするだけです。3 つの状況に分けて、さまざまなダンプ情報を確認します。

一般的な同期方法

import java.util.concurrent.TimeUnit;
public class Test {
    
    
    public static void main(String[] args) {
    
    
        Test test = new Test();
        test.helper();
    }

    public synchronized void helper() {
    
    
        try {
    
    
            System.out.println("hello");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

結果:

"main" #1 prio=5 os_prio=0 tid=0x00c46800 nid=0x754 waiting on condition [0x0283f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:340)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
	at com.company.Test.helper(Test.java:16)
	- locked <0x04b45e20> (a com.company.Test)
	at com.company.Test.main(Test.java:10)

ポイントは次のとおりです: - ロックされた <0x04b45e20> (com.company.Test)

静的同期方式

import java.util.concurrent.TimeUnit;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Test test = new Test();
        test.helper();
    }

    public static synchronized void helper() {
    
    
        try {
    
    
            System.out.println("hello");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

結果:

"main" #1 prio=5 os_prio=0 tid=0x013d5c00 nid=0x1b28 waiting on condition [0x02edf000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:340)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
	at com.company.Test.helper(Test.java:14)
	- locked <0x05143378> (a java.lang.Class for com.company.Test)
	at com.company.Test.main(Test.java:8)

ポイントは次のとおりです: - ロックされた <0x05143378> (com.company.Test の java.lang.Class)

同期ブロック

import java.util.concurrent.TimeUnit;

public class Test {
    
    
    public static String lock = "";
    public static void main(String[] args) {
    
    
        Test test = new Test();
        test.helper();
    }

    public static void helper() {
    
    
        synchronized (lock) {
    
    
            try {
    
    
                System.out.println("hello");
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

結果:

"main" #1 prio=5 os_prio=0 tid=0x01336000 nid=0x258c waiting on condition [0x0164f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:340)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
	at com.company.Test.helper(Test.java:16)
	- locked <0x050095e0> (a java.lang.String)
	at com.company.Test.main(Test.java:9)

ポイントは次のとおりです: - ロックされた <0x050095e0> (java.lang.String)

結論は

これら 3 つの例を通して、本の内容を確認できます。

形状 ロックオブジェクト
同期方法 com.company.テスト
静的同期方式 com.company.Test の java.lang.Class
静的ブロック (括弧内の文字列オブジェクト) java.lang.String

おすすめ

転載: blog.csdn.net/sayWhat_sayHello/article/details/119333793