确保一个类只有一个实例(举例:任务管理器、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就不能修改了 }