1. ホーム

[解決済み] Java synchronized method lock on object, or method?

2022-04-10 14:58:16

質問

同じクラスに2つのsynchronizedメソッドがあり、それぞれが異なる変数にアクセスしている場合、2つのスレッドが同時にその2つのメソッドにアクセスすることは可能ですか?ロックはオブジェクトに対して行われるのでしょうか、それとも同期メソッド内の変数と同じように特定されるのでしょうか?

class X {

    private int a;
    private int b;

    public synchronized void addA(){
        a++;
    }

    public synchronized void addB(){
        b++;
    }

}

2つのスレッドがクラスXの同じインスタンスにアクセスすることは可能か? x.addA( ) と x.addB() を同時に使用するのですか?

どのように解決するのですか?

として宣言した場合、そのメソッドは 同期 (と入力することで行っています)。 public synchronized void addA() で同期させます。 全体 オブジェクトから別の変数にアクセスする2つのスレッドは、いずれにせよ互いにブロックされます。

もし、一度にひとつの変数だけを同期させ、ふたつのスレッドが異なる変数にアクセスする際に互いにブロックしないようにしたい場合は、それぞれを synchronized () ブロックになります。もし ab は、オブジェクトの参照を使用するものでした。

public void addA() {
    synchronized( a ) {
        a++;
    }
}

public void addB() {
    synchronized( b ) {
        b++;
    }
}

しかし、これらはプリミティブであるため、これを行うことはできません。

を使用することをお勧めします。 AtomicInteger の代わりに

import java.util.concurrent.atomic.AtomicInteger;

class X {

    AtomicInteger a;
    AtomicInteger b;

    public void addA(){
        a.incrementAndGet();
    }

    public void addB(){ 
        b.incrementAndGet();
    }
}