静态同步方法与静态方法,同步块中的所有代码

时间:2012-10-26 10:17:04

标签: java android concurrency static synchronized

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

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

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

干杯, 马特

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();
    }
}

1 个答案:

答案 0 :(得分:1)

除方法签名外,它们完全相同。当您使静态方法同步时,它与在类令牌上同步方法的完整主体相同。当您使非静态方法同步时,它与在此指针上同步相同。方法签名差异很少相关,但例如,它可能是编译器警告,以覆盖同步方法并使重写方法不同步。