懒汉、饿汉、双重校验锁
1、懒汉:需要时才会去创建
public Class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton getInstance(){
if( instance == null ){instance = new Singleton(); }
return instance;
}
}
2、饿汉:线程安全,类加载时就创建了实例
public Class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
//饿汉方式可做变种,将实例放入静态代码块中:
static{
instance = new Singleton();
}
3、双重校验锁: volatile 修饰实例变量,同时synchronized同步方法
在懒汉实现中,如果两个线程同时执行了if判断为null的情况,则会依次执行同步代码块里的代码,为避免创建两个实例,在同步代码块里添加if进行二重校验。
public Class Singleton{
private static volatile Singleton instance = null; //volatile是jdk1.5后才有的
private Singleton(){}
public static Singleton getInstance(){
if( instance == null ){
Synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
另:还有静态内部类的实现方式,相当于把饿汉的创建实例方式提到内部类,在外部类getInstance方法内return它的内部类变量(此种方式是线程安全的)