0
public class Check {

    public boolean toChange = false;

    public synchronized boolean getChange() {
        return tochange
    }

    public synchronized setChange(boolean change) {
        this.tochange = change
    }
}

2 つの異なるスレッドが同時に get と set にアクセスしようとすると、チェック オブジェクトのロックにより同期的に発生しますか?

4

2 に答える 2

4

両方のメソッドが非静的同期的であるため、同じインスタンスに属している場合、いつでも 2 つのスレッドが両方のメソッドを同時に実行することはできません。

はい、このクラスのインスタンス内で同期的に発生します。

作成するときCheck c = new Check();

そして2つのスレッド、つまりアクセスをt1, t2試み、同時に、1つのスレッドのみがモニターへのアクセスを許可され(これはインスタンスです)、他のスレッドは前のスレッドが作業を終了してモニターを解放するまで待機する必要があります。c.getChange()c.setChange()c

ここでインスタンスcは、アクセスを同期するために使用されるデフォルトのモニターです

于 2013-05-19T07:33:23.673 に答える
0

オブジェクトのロックを保持できるスレッドは 1 つだけです。そして、そのオブジェクトの同期メソッドに入ることができるのはそのスレッドだけです。他のスレッドは、そのオブジェクトの同期メソッドのいずれにもアクセスできません。

ただし、スレッドはメソッドから戻ることなくロックを解放できます。

Object.wait()

最初のスレッドが Check オブジェクトのインスタンスに対するロックを解除するまで、他のスレッドはブロックされた状態になります。

したがって、答えは「はい」です。2 つの異なるスレッドが get メソッドと set メソッドに同時にアクセスすることはできません。

于 2013-05-19T07:52:29.380 に答える