所谓单例模式就是为了确保类在内存中只有一个对象,之所以会出现单例模式是因为,单例模式在系统内存中只存在一个对象,可以节约资源
目录
一、饿汉式
该方式在开发中是经常用的,因为这个方式不容易出错
程序代码:
package com.hezhiying;
public class Main {
public static void main(String[] args) {
// 创建的这两个对象都是Student类中的s
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1 == s2);
}
}
class Student {
// 让该方法私有,这样外界就不能访问了
private Student() {
};
// 由于外界不能创建对象,故自己创建一个,为了不让外界修改s的值,故加个private
private static Student s = new Student();
// 提供一个公共的访问方式,需静态方法,以使类名直接调用,以达到外界能够访问
public static Student getStudent() {
return s;
}
}
运行结果:
二、懒汉式
该方法在开发中不容易用到,但是如果你去找工作,可能会被面试,因为这有个小坑,就是关于多线程的坑,在代码中有注释
程序代码:
package com.hezhiying;
public class Main {
public static void main(String[] args) {
// 创建的这两个对象都是Student类中的s
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1 == s2);
}
}
class Student {
// 让该方法私有,这样外界就不能访问了
private Student() {
};
// 由于外界不能创建对象,故自己创建一个,为了不让外界修改s的值,故加个private
private static Student s = null;
// 提供一个公共的访问方式,需静态方法,以使类名直接调用,以达到外界能够访问
public synchronized static Student getStudent() {
// 在这里,在多线程中可能会在线程一进了if,还没进行创建对象,
// 线程二也进来了,这就会导致创建了两个对象,也就不是单例模式了,故需要用synchronized
if (s == null) {
s = new Student();
}
return s;
}
}
运行结果: