java 在同步锁内外判断两次,有什么用处?
关注者
124被浏览
25,22628 个回答
主要是性能问题,你下面的这个玩意儿不管任何时候被调用都会先获得锁,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 里无效,却容易写错,建议不要用。具体参考:https://www.infoq.cn/article/double-checked-locking-with-delay-initialization