お気に入りインタビュアーは、あなたがいくつかを知って、使用同期の5種類を尋ねましたか?

序文

我々は、すべての同期スレッドセーフな同期を知っている、ほとんどのプログラムは、おそらく唯一の上記の同期方法を使用します。実際には、同期は、より多くの機会を使用することができ、いくつかの使用方法を示しています。

図1に示すように、従来の方法同期

我々は、同期ロックを放棄するスレッドセーフウェイ限り、ほとんどを使用する理由です。この方法は、使用するのが最も簡単ですが、しかし、唯一の上記単一のアクションの実施形態では、そうでない場合は、単一の実施形態では、ロック同期方法は失敗します。
/**
 * 用在普通方法
 */
private synchronized void synchronizedMethod() {
    System.out.println("synchronizedMethod");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}


复制代码
この場合、同じインスタンスつのみのスレッドがこのメソッドを入力するためのロックを取得することができます。

2、同期静的メソッド

同期静的メソッド、どんなにクラスの多くのインスタンスは、1つのスレッドのみ、このメソッドを入力するロックを取得することができます。
/**
 * 用在静态方法
 */
private synchronized static void synchronizedStaticMethod() {
    System.out.println("synchronizedStaticMethod");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}


复制代码
同期静的メソッドは、スレッドが、この方法のいずれかに入ると、他のすべてのスレッドは、このタイプのアプローチの任意の同期ロックにアクセスできなくなり、クラスレベルロックです。

3、同期クラス

以下は、同期クラス、ピン止め効果同期静的メソッドの2つのメソッドを提供し、クラスレベルのロックであり、唯一のスレッドが同期クラスロックとメソッドにアクセスすることができます。
/**
 * 用在类
 */
private void synchronizedClass() {
    synchronized (TestSynchronized.class) {
        System.out.println("synchronizedClass");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 用在类
 */
private void synchronizedGetClass() {
    synchronized (this.getClass()) {
        System.out.println("synchronizedGetClass");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


复制代码
ここでは、2つの用途は、同期ブロックの使用は、これだけのコードブロックを入力するには、クラスのロックを取得するためにここに表さ。

図4に示すように、この同期の例

この用法は、ブロックを同期全体の現在のオブジェクトのインスタンスは、この方法だけを入力するにはロックのこのインスタンスを取得表してロックされます。
/**
 * 用在this
 */
private void synchronizedThis() {
    synchronized (this) {
        System.out.println("synchronizedThis");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


复制代码
一般的な使用との同期方法はロックし、現在のインスタンス全体でロックされています。

図5に示すように、同期オブジェクト・インスタンス

これはまた、シンクブロックの使用であり、ここに示されているだけこの方法を入力するには、このインスタンス・ロック・ロックを取得するために、全体のオブジェクトのインスタンスをロックするロックとして、上記の現在のインスタンスをロックします。
/**
 * 用在对象
 */
private void synchronizedInstance() {
    synchronized (LOCK) {
        System.out.println("synchronizedInstance");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


复制代码
さらに、クラスがロックブロックの各例をロックしていないが、同じタイプのロック、同一のロック現在のインスタンス、同じオブジェクトがロックに互いをブロックします。

遂に 

私は、データのコンパイルが内側になり、記事が更新される中でみんなの注目公共の群れ番号[プログラマ]を、お待ちしております。


おすすめ

転載: juejin.im/post/5dc031ebf265da4cfd2962e6