Java中单例模式—饿汉式和懒汉式

116 阅读2分钟

所谓单例模式就是为了确保类在内存中只有一个对象,之所以会出现单例模式是因为,单例模式在系统内存中只存在一个对象,可以节约资源

目录

一、饿汉式

二、懒汉式


一、饿汉式

该方式在开发中是经常用的,因为这个方式不容易出错

程序代码:

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;
	}
}

运行结果: