最近在一些博客上面看到的单例模式,无一例外都是饿汉和懒汉,这两个确实是单例模式,但是各有自己的弊端
先上代码吧
//饿汉式
class ClassA{
private static final ClassA instance = new ClassA();
public static ClassA newInstance(){
return instance;
}
private ClassA(){}
}
//懒汉式
class ClassB{
private static ClassB instance = null;
public static synchronized ClassB newInstance(){
if (instance == null) instance = new ClassB();
return instance;
}
private ClassB(){}
}
不管饿汉式还是懒汉,都有自己的弊端。
一般用到单例模式的对象,都是比较占用内存。饿汉在类加载的时候,就创建了对象,在实际开发中,特别占用内存;懒汉虽然没有在类加载的时候创建对象,但是效率极低,毕竟有synchronized加锁,在现在多线程的时候,效率自然而然就降低了,下面分享一个两全其美的办法
class ClassC{
private static class Holder{
static ClassC instance = new ClassC();
}
public static ClassC newInstance(){
return Holder.instance;
}
private ClassC(){}
}
这个方法,利用了静态内部类,这样,在类加载的时候并不会加载静态内部类,而且也完美的解决的多线程并发的问题(因为静态内部类只会在创建一次)。
第一次写博客,如果有什么不对的地方请在回复指教。