第一种 :
class Single {
private static final Single ourInstance = new Single();
public String name = "ltf";
static Single getInstance() {
return ourInstance;
}
private Single() {
}
}
第二种:
public class SingleHolder {
private SingleHolder(){
}
private static class SingleInnerHolder{
private static SingleHolder singleHolder = new SingleHolder();
}
第一种在Android Studio里面,创建单例的时候,谷歌是推荐我们这种写法。
第二种叫Lazy initialization holder class,Lazy在哪儿,我对这个方法的疑惑是静态内部类的加载时间,百度到一番话:“静态内部类和非静态内部类一样,都是在被调用时才会被加载”,如果这个句话真,那么这种单例写法实现懒加载就成立。当然,“静态内部类和非静态内部类一样,都是在被调用时才会被加载”这句话是别人论证出来的,那么我先认为他是对的,在工作中去验证。
后续:
还有第三种叫double-checked locking,
private static volatile Something instance = null;
public Something getInstance() {
if (instance == null) {
synchronized (this) {
if (instance == null)
instance = new Something();
}
}
return instance;
}
参阅资料:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile
网友评论