0

次のコード スニペットは、libcore プロジェクトの Android JellyBean ReferenceQueue.java から取得したものです。

メソッドに同期修飾子を追加する代わりに、ReferenceQueue.classで同期する同期ブロックが使用される理由を誰か教えてもらえますか? この場合、これら 2 つのアプローチは機能的に同等ですか?

私が見た同様の質問から、メソッドを同期させる方が効率的であるようです。

乾杯、マット

public class ReferenceQueue<T> {
... <snip> ...
public static Reference unenqueued = null;

static void add(Reference<?> list) {
    synchronized (ReferenceQueue.class) {
        if (unenqueued == null) {
            unenqueued = list;
        } else {
            Reference<?> next = unenqueued.pendingNext;
            unenqueued.pendingNext = list.pendingNext;
            list.pendingNext = next;
        }
        ReferenceQueue.class.notifyAll();
    }
}
4

1 に答える 1

1

メソッドのシグネチャを除いて、これらはまったく同じです。静的メソッドを同期化すると、クラス トークンでメソッドの本体全体を同期化するのと同じことになります。非静的メソッドを同期化すると、 this ポインターで同期化するのと同じになります。メソッド シグネチャの違いが関係することはめったにありませんが、たとえば、同期されたメソッドをオーバーライドし、オーバーライドしているメソッドを非同期にするというコンパイラの警告である可能性があります。

于 2012-10-26T10:27:04.573 に答える