0

以下代码片段取自 libcore 项目中的 android JellyBean ReferenceQueue.java。

有人能告诉我为什么使用同步块,在 ReferenceQueue.class 上同步,而不是在方法中添加同步限定符吗?在这种情况下,这两种方法在功能上是否等效?

从我看到的类似问题来看,使方法同步似乎更有效。

干杯,马特

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 回答