以下代码片段取自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();
}
}
答案 0 :(得分:1)
除方法签名外,它们完全相同。当您使静态方法同步时,它与在类令牌上同步方法的完整主体相同。当您使非静态方法同步时,它与在此指针上同步相同。方法签名差异很少相关,但例如,它可能是编译器警告,以覆盖同步方法并使重写方法不同步。