单例的价值所在:
当一个程序中有比较大的或者消耗内存的存在,这时候你就希望只是出现一个实例。
在移动开发中用到的话比较好。保持程序运行的时候该中始终只有一个实例存在内存中
public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){ }
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
必须防止外部可以调用构造函数进行实例化,因此构造函数必须私有化。
必须定义一个静态函数获得该单例
单例使用volatile修饰
使用synchronized 进行同步处理,并且双重判断是否为null,我们看到synchronized (Singleton.class)里面又进行了是否为null的判断,这是因为一个线程进入了该代码,如果另一个线程在等待,这时候前一个线程创建了一个实例出来完毕后,另一个线程获得锁进入该同步代码,实例已经存在,没必要再次创建,因此这个判断是否是null还是必须的。
还有 饿汉式 和 懒汉式
单例模式:懒汉式和饿汉式
饿汉式:线程安全:构造方法私有化:推荐使用
public class Singleton{
private static Singleton singleton = new Singleton ();//类创建时,就创建一个静态对象,之后不会再改变
private Singleton (){}
public Singleton getInstance(){return singletion;}
}
懒汉式:线程不安全:若生成实例的时候若不加synchronized(线程同步),会发生线程不安全:如:当一个线程执 行到(2)时,还未生成对象,另一个线程执行(1);这时就会发生线程不安全
public class Singleton{
private static Singleton singleton = null;
public static synchronized getInstance(){
if(singleton==null){//(1)
//(2)
singleton = new Singleton();//(3)
}
return singleton;
}
}