java 在同步锁内外判断两次,有什么用处?

在看Eventbus源码的时候,看见它获取单例对象的方法里有如下代码: public static EventBus getDefault() { i…
关注者
124
被浏览
25,226

28 个回答

主要是性能问题,你下面的这个玩意儿不管任何时候被调用都会先获得锁,defaultInstance有值以后直接返回就行了嘛,还有必要先加个锁吗?

所以应该把你下面的代码改成这样:

private static synchronized EventBus _getDefault() {
    if (defaultInstance == null) {
        defaultInstance = new EventBus();
    }
    return defaultInstance;
}
public static EventBus getDefault() {
    if (defaultInstance == null) {
        return _getDefault();
    }
    return defaultInstance;    
}

这样如果defaultInstance有值的话没有获得锁直接就返回了,没有的话才去调用_getDefault方法,这个时候才需要获得锁。

你把我这里的这两个方法合成一个方法,是不是和题中第一种方案一个鸟样了?

多说一句,这是单例懒汉式的参考实现。

在 Java 里无效,却容易写错,建议不要用。具体参考:infoq.cn/article/double