确保一个类只有一个实例(举例:任务管理器、Runtime类)
饿汉式和懒汉式区别:
-
单线程
饿汉式:空间换时间(一上来就直接创建对象)更好
懒汉式:时间换空间(没有直接创建对象)
-
多线程
饿汉式:没有安全隐患
懒汉式:可能会出现安全隐患,会创建多个对象
package day25;
public class Dk1Singleton {
//单例设计模式
//类只能创建一个对象
public static void main(String[] args) {
/*由于加入private,所以无法调用
Singleton s1 = Singleton.s; //将s的地址值赋给s1,指向同一个对象
Singleton s2 = Singleton.s;
System.out.println(s1 == s2); //结果为true,地址值相同,为同一个对象
*/
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1 == s2); //结果为true,此时不能修改对象值(没有设置set方法)
Singleton3 s3 = Singleton3.s;
Singleton3 s4 = Singleton3.s;
System.out.println(s3 == s4); //结果为true
}
}
//单例设计模式3步(饿汉式)——好
class Singleton {
private Singleton() {}; //私有构造方法,只能在本类创建对象
private static Singleton s = new Singleton(); //在本类创建对象,加入static其他类不用创建对象就可以调用s这个成员变量
//private 就是为了不让其他类访问s这个对象,不能修改s的地址值
public static Singleton getInstance() { //对外提供公共访问方法,返回本类对象
return s; //不能返回new Singleton(),那样每次创建新的对象
}
}
//懒汉式(单例延迟加载)——不好
//多线程访问懒汉式有问题
class Singleton2 {
private Singleton2() {}; //私有构造方法,只能在本类创建对象
private static Singleton2 s; //没有创建对象,只是声明引用
public static Singleton2 getInstance() { //对外提供公共访问方法,返回本类对象
if (s == null) {
//线程1和线程2可能会同时访问,创建多个对象
s = new Singleton2(); //第一次调用创建对象
}
return s; //不能返回new Singleton(),那样每次创建新的对象
}
}
//第三种模式final
class Singleton3 {
private Singleton3() {}; //私有构造方法,只能在本类创建对象
public final static Singleton3 s = new Singleton3(); //创建本类公共对象,加入final就不能修改了
}