web-dev-qa-db-ja.com

Javaでの静的同期メソッドの使用は何ですか?

クラスオブジェクトでロックされている静的同期メソッドと、オブジェクトの現在のインスタンスで同期メソッドがロックされていることを読んでいるのですが、クラスオブジェクトでロックされる意味は何ですか?

誰でもこのトピックで私を助けてくれますか?

44
snehal

一般に、synchronizedメソッドは、同時にアクセスされるリソースへのアクセスを保護するために使用されます。同時にアクセスされるリソースがクラスの各インスタンスに属する場合、synchronizedインスタンスメソッドを使用します。リソースがすべてのインスタンスに属している場合(つまり、static変数にある場合)、synchronized staticメソッドを使用してアクセスします。

たとえば、作成したすべてのオブジェクトの「レジストリ」を保持するstaticファクトリメソッドを作成できます。そのようなレジストリの自然な場所は、staticコレクションです。ファクトリが複数のスレッドから使​​用される場合、ファクトリメソッドsynchronizedを作成する(またはメソッド内にsynchronizedブロックを持つ)必要があり、共有staticコレクションへのアクセスを保護します。

特定のロックオブジェクトなしでsynchronizedを使用することは、他の人が書いたコードで使用するライブラリを構築する場合、一般に最も安全な選択ではないことに注意してください。これは、悪意のあるコードがオブジェクトまたはクラスで同期して、独自のメソッドの実行をブロックする可能性があるためです。これからコードを保護するには、プライベート「ロック」オブジェクト、インスタンスまたは静的を作成し、代わりにそのオブジェクトで同期します。

71
dasblinkenlight

実行時には、ロードされたすべてのクラスに Class オブジェクトのインスタンスがあります。これは、static synchronizedメソッドによって共有ロックオブジェクトとして使用されるオブジェクトです。 (同期されたメソッドまたはブロックは、some共有オブジェクトをロックする必要があります。)

必要に応じて、このオブジェクトを手動で同期することもできます(静的メソッドであるかどうかに関係なく)。これらの3つのメソッドは同じように動作し、一度に1つのスレッドのみが内部ブロックに入ることができます。

class Foo {
    static synchronized void methodA() {
        // ...
    }

    static void methodB() {
        synchronized (Foo.class) {
            // ...
        }
    }

    static void methodC() {
        Object lock = Foo.class;
        synchronized (lock) {
            // ...
        }
    }
}

static synchronizedメソッドの目的は、クラスのstatic変数に格納された可変状態を一度に1つのスレッドのみに許可する場合です。

現在、Javaには Java.util.concurrent およびそのサブパッケージのより強力な同時実行機能がありますが、synchronizedメソッドなどのコアJava 1.0コンストラクトは引き続き有効で使用可能です。

56
Boann

簡単に言えば、static synchronizedメソッドはオブジェクトではなくクラスをロックします。キーワードstaticは「インスタンスではなくクラス」を意味するため、クラスをロックします。

キーワードsynchronizedは、一度に1つのスレッドのみがメソッドにアクセスできることを意味します。
そしてstatic synchronized意味:

一度に1つのスレッドのみがクラスにアクセスできます。

41
Luis Pena

静的メソッドは同期できます。ただし、クラスごとに1つのロックがあります。 Javaクラスがロードされると、対応するJava.lang.classクラスオブジェクトがそこにあります。そのオブジェクトのロックは、静的同期メソッドに必要です。したがって、一度に複数のスレッドによるアクセスを制限する必要がある静的フィールドがある場合、それらのフィールドをプライベートに設定し、パブリックな静的同期セッターまたはゲッターを作成してそれらのフィールドにアクセスできます。

0
Sarala Kumarage

クラスに複数の静的同期メソッド(m1、m2、m3、m4)があり、1つのスレッドがm1にアクセスしている場合、同時に他のスレッドが他の静的同期メソッドにアクセスできないと仮定します。

0
Aman Gupta