有时候,我们希望JVM中只有一个类的对象。
实现单例(Singleton)有两种方式。
1.饿汉式
public class Singleton {
//饿汉式(声明实例引用即实例化)类装载的时候实例化存放在方法区内(不存在线程并发)
private static Singleton singleton = new Singleton();
//构造方法私有
private void Singleton (){
}
//提供访问点
public static Singleton getSingleton(){
return singleton;
}
}
饿汉式不存在并发的情况,但是在类加载的时候即申请内存实例化(对于大对象来说还是比较消耗内存)
2.懒汉式
public class Singleton {
//懒汉式(声明实例引用不实例化,第一次调用方法时,实例化)
//对于创建实例代价大,且不定会使用时,使用懒加载模式可以减少开销
//缺点:在单线程下能保证只有一个实例,多线程下有创建多个实例的风险
private static Singleton singleton = null;
private void Singleton(){
}
public static Singleton getSingleton(){
/*这种方式存在并发的情况
if(singleton!=null){
}else{
singleton = new Singleton();
}
return singleton;
*/
//只有调用getSingleton时才会装载内部类,才会创建实例(不存在线程并发)
return InnerClass.INSTANCE;
}
private static class InnerClass{
private static final Singleton INSTANCE = new Singleton();
}
}