0

私はどこかで、これらの次のコードの断片が同期化されたコードに関して同等であることを読みました:

public synchronized void printMsg() {
    System.out.println("synchronized");
}


public void printMsg() {
    synchronized(this) {
        System.out.println("synchronized");
    }
}

私の知る限り、スレッドがオブジェクトの同期されたメソッドにアクセスするとき、その同期されていないメソッドはロックされません。つまり、他のスレッドは同じインスタンスを使用してそれらにアクセスできます。

2番目のフラグメントを観察すると、コードがで同期されているため、thisそのコードにアクセスするスレッドがオブジェクトのロックを取得しているように見えます。

私の質問は、ThraedprintMsg()が2番目のコードスニペットを使用してメソッドを実行するロックを維持しているときに、他のスレッドが他のクラスメソッドにアクセスできるかどうかです。

いいえの場合、上記の方法はまったく同じではありません。何が本当?

4

2 に答える 2

2

最初のメソッドは暗黙的にロックを取得するthisため、2 番目のメソッドと同じです。

同期されていない、またはメソッド本体で同期されていないその他のメソッドはthis、オブジェクトをロックしようとせず、他のスレッドによって同時に実行できます。

于 2013-02-12T19:13:22.347 に答える
1

上記の方法は同じです。スレッドは、同期キーワードでマークされていない限り、メソッドにアクセスするためにオブジェクトのロックを取得する必要はありませんsynchronized (this)。ロックを保持しているスレッドがあっても、他のすべてのスレッドはこれらのメソッドを実行します。

于 2013-02-12T19:19:38.573 に答える