0

Javaでのオブジェクト ロックについて質問があります。元。コード:

public class A 
{
    private static A a = null; // singleton instance

    private A()
    {

    }

    public static synchronized A getInst()
    {
        if (a == null)
        {
            a = new A();
        }
        return a;
    }

    public synchronized void method1()
    {
        //some action
    }

    public synchronized void method2()
    {
        //some action
    }
}

スレッド (たとえばthread-1 ) が内部で動作しているmethod1()場合、thread-1はシングルトン オブジェクトのロックを取得します。しかし、別のスレッド (たとえば、thread-2 ) は、スレッド 1がロックを解放するのを待たずmethod2()に、スレッドに入りたいと考えています。このロックは、スレッド 1スレッド 2の両方でどのように共有されますか?

ありがとう

4

5 に答える 5

1

しかし、別のスレッド (スレッド 2 など) がメソッド 2 に入りたい場合、スレッド 1 がロックを解放するのを待たずにメソッド 2 に入ります。

それはしません。

一度に 1 つのスレッドだけがオブジェクトのロックを取得できます。

なので、thread-1ロックを解除しないとthread-2実行できませんmethod2

これを読んでください。

于 2013-03-15T11:36:29.180 に答える
0

シングルトン クラスでは、1 つのインスタンスのみが使用可能になります。そのため、同期されたメソッドを呼び出すと、その単一のインスタンスがロックされます。複数の同期メソッドが存在する場合、一度に実行されるメソッドは 1 つだけです。前のメソッドがロックを解除するのを待つ必要があります。したがって、基本的に、このシングルトン クラスには 1 つのスレッドしか存在しません。

他のメソッドがロックされているために他のメソッドが影響を受けないようにしたい場合は、singleton クラスでオブジェクト ロック付きの同期ブロックを使用します。

private final Object object1 = new Object();
private final Object object2 = new Object();

public void method1 {
    synchronized(object1) {
    ....
    }
}

public void method2 {
    synchronized(object2) {
    ....
    }
}
于 2013-03-15T11:42:21.700 に答える
0

同期されたメソッドはどちらもインスタンスメソッドであるため、すべてのスレッドが同じインスタンスを参照している場合、複数のスレッドが同時にそれらにアクセスすることはできません。クラスのインスタンスが1つしかないため(シングルトンパターン)、その結果、1つのスレッドがアクセスしている場合、スレッド1がロックを解放するか完全に実行されるまでmethod1()、他のスレッドへのアクセスは待機状態になります。method2()method1()

于 2013-03-15T11:42:44.647 に答える
0

しかし、別のスレッド (スレッド 2 など) がメソッド 2 に入りたい場合、スレッド 1 がロックを解放するのを待たずにメソッド 2 に入ります。

A のインスタンスmethod1()を使用して同期されるスレッド 1 が実行されている間、同じA のインスタンスを使用して同期されるスレッド 2 が実行される前に待機します( Singletonであるため) 。method2()

次のような同期メソッドではなく、同期コード ブロック(クリティカル セクション)と見なすことができます。

public void method1()
{
    synchronized (this)
    {
        //some action
    }
}

public void method2()
{
    synchronized (this)
    {
        //some action
    }
}

そのように考えると、両方のメソッドで同じインスタンス (オブジェクト ロック) を参照thisしていることがわかります。

于 2013-03-15T11:44:07.160 に答える
0

synchronized同期メソッドではなく、特定のロック オブジェクトを使用するブロックを使用する必要があります。このような場合、メソッド全体を同期する必要がない場合、ロックが必要なメソッドの特定の部分だけをブロックするのも簡単です。これにより、マルチスレッド アクセスが高速化される可能性があります。

例えば

Object lock = new Object;
public void method1() {
    synchronized(lock) {
      // do stuff here
    }
}
于 2013-03-15T11:36:32.940 に答える