线程安全问题:这里指的是获取单例对象时候的问题,不是对象共享资源修改时候的问题。
双重锁定:“二次判断” ,不用每个线程在执行这个方法之前都会去等待获得锁。
如果不加同步,多个线程创建多个对象的问题,后一个覆盖前一个。
if(instance==null)
{
instance=new Singleton();
}
private Singleton(){}
private volatile static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
//synchronized (this)
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
类加载时候初始化对象: 不能延迟加载(对象大的时候,是一种空间浪费),适合类初始化时候就需要加载的场景。
public class Singleton {
private Singleton(){
}
//也可以不用加final,加上也行。因为私有构造方法,和私有属性可以保证其它类调用不会修改instance 。
private static Singleton instance =new Singleton();
public static Singleton getInstance(){
return instance;
}
}
static 内部类,延迟加载,使用虚拟机同步机制,不需要加synchronized
public class Singleton
{
private static class SingletonHolder
{
public final static Singleton instance = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.instance;
}
}