クラスオブジェクトでロックされている静的同期メソッドと、オブジェクトの現在のインスタンスで同期メソッドがロックされていることを読んでいるのですが、クラスオブジェクトでロックされる意味は何ですか?
誰でもこのトピックで私を助けてくれますか?
一般に、synchronized
メソッドは、同時にアクセスされるリソースへのアクセスを保護するために使用されます。同時にアクセスされるリソースがクラスの各インスタンスに属する場合、synchronized
インスタンスメソッドを使用します。リソースがすべてのインスタンスに属している場合(つまり、static
変数にある場合)、synchronized static
メソッドを使用してアクセスします。
たとえば、作成したすべてのオブジェクトの「レジストリ」を保持するstatic
ファクトリメソッドを作成できます。そのようなレジストリの自然な場所は、static
コレクションです。ファクトリが複数のスレッドから使用される場合、ファクトリメソッドsynchronized
を作成する(またはメソッド内にsynchronized
ブロックを持つ)必要があり、共有static
コレクションへのアクセスを保護します。
特定のロックオブジェクトなしでsynchronized
を使用することは、他の人が書いたコードで使用するライブラリを構築する場合、一般に最も安全な選択ではないことに注意してください。これは、悪意のあるコードがオブジェクトまたはクラスで同期して、独自のメソッドの実行をブロックする可能性があるためです。これからコードを保護するには、プライベート「ロック」オブジェクト、インスタンスまたは静的を作成し、代わりにそのオブジェクトで同期します。
実行時には、ロードされたすべてのクラスに 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コンストラクトは引き続き有効で使用可能です。
簡単に言えば、static synchronized
メソッドはオブジェクトではなくクラスをロックします。キーワードstatic
は「インスタンスではなくクラス」を意味するため、クラスをロックします。
キーワードsynchronized
は、一度に1つのスレッドのみがメソッドにアクセスできることを意味します。
そしてstatic synchronized
意味:
一度に1つのスレッドのみがクラスにアクセスできます。
静的メソッドは同期できます。ただし、クラスごとに1つのロックがあります。 Javaクラスがロードされると、対応するJava.lang.classクラスオブジェクトがそこにあります。そのオブジェクトのロックは、静的同期メソッドに必要です。したがって、一度に複数のスレッドによるアクセスを制限する必要がある静的フィールドがある場合、それらのフィールドをプライベートに設定し、パブリックな静的同期セッターまたはゲッターを作成してそれらのフィールドにアクセスできます。
クラスに複数の静的同期メソッド(m1、m2、m3、m4)があり、1つのスレッドがm1にアクセスしている場合、同時に他のスレッドが他の静的同期メソッドにアクセスできないと仮定します。