单例模式中的懒汉式和饿汉式

一、懒汉式

在第一次调用的时候实例化自己,存在线程安全问题。可以通过在getInstance方法上加同步,或者是在双重检查锁定,或者是静态内部类。

private Singleton(){}
private static Singleton singleton=null;
private static Singleton getInstance(){
	if(singleton==null){
	singleton=new Singleton();	
	}else{
		return singleton;
	}
	return singleton;

双重检查锁定的方法:

public static Singleton getInstance() {  
        if (singleton == null) {    
            synchronized (Singleton.class) {    
               if (singleton == null) {    
                  singleton = new Singleton();   
               }    
            }    
        }    
        return singleton;   
    }  

静态内部类:

public class Singleton {    
    private static class LazyHolder {    
       private static final Singleton INSTANCE = new Singleton();    
    }    
    private Singleton (){}    
    public static final Singleton getInstance() {    
       return LazyHolder.INSTANCE;    
    }    
}    

二、饿汉式,不存在线程安全问题

private  Singleton(){}
private  static Singleton single=new Singleton();
private static final Singleton getInstance(){
	return single;
}

一般情况下在单例模式下使用getInstance的方法创建对象,但是它与new出来的对象有什么区别?

GetInstance与new区别:
new的使用:如Object object = new Object(),这时候,就必须要知道有第二个public的Object构造方法的
存在。
GetInstance的使用:在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它
的引用,即内存中有一块区域专门用来存放静态方法和变量,可以直接使用,调用多次返回同一个对象。
(1)对象使用之前通过getinstance得到,而不需要自己定义,用完之后不需要delete;
(2)new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的
引用给你使用,这在效能上优于new;
(3) new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()

通常是创建static静态实例方法的。




你可能感兴趣的:(单例模式中的懒汉式和饿汉式)