单例设计模式保证一个类在内存中只能有一个对象-------->不让其他类创建对象------>构造函数私有化,类中创建一个对象,定义一个方法返回值是该对象---->其他类通过方法获取类对象。
可分为两类-----懒汉式和饿汉式
懒汉式-----使用的时候才会创建实例对象
饿汉式------直接创建实例对象
饿汉式
//饿汉式
public class Singleton {
//直接创建对象
public static Singleton instance = new Singleton();
//私有化构造函数
private Singleton(){
}
//返回对象实例
public static Singleton getInstance(){
return instance;
}
}
懒汉式
//懒汉式
public class Singleton2 {
//声明变量
public static volatile Singleton2 singleton2 = null;
//私有化构造函数
private Singleton2(){
}
//提供对外方法
public static Singleton2 getInstance(){
if (singleton2 == null){
synchronized (Singleton2.class){
if (singleton2 == null){
singleton2 = new Singleton2();
}
}
}
return singleton2;
}
}
双重锁定---------->为了确保只有一个实例对象
两个线程同时调用getInstance(),均通过第一个if----->遇到synchronized,线程A进入第二个if,线程B等待------>线程A创建对象,退出-------->线程B进入,检测到对象不为空,不能调用.
如果没有第二层if ,线程B仍然可以创建对象-------------->存在两个实例对象,违背单例设计模式初衷。
第一层if,主要为了提高性能,线程A创建实例对象后,其他线程不必进入synchronized。