正常在实体类下定义一个属性,在测试类中去创建他两次,此时stu1和stu2的内存地址不同
- public class Student {
- private String name;
- }
在懒汉式下,stu1和stu2的内存地址相同
- //代码
- public class Student {
- private static Student stu;
- private Student(){
- super();
- }
- public static synchronized Student getInstance(){
- if(stu == null){
- stu = new Student();
- }
- return stu;
- }
- }
在饿汉式下,stu1和stu2的内存地址相同
- public class Student {
- private static Student stu = new Student();
- private Student(){
- super();
- }
- public static synchronized Student getInstance(){
- return stu;
- }
-
- }
- //用于测试懒汉式和饿汉式
- public class Test01 {
- public static void main(String[] args) {
- Student stu1 = Student.getInstance();
- Student stu2 = Student.getInstance();
- System.out.println(stu1== stu2);
- }
- }
- //懒汉式和饿汉式的结果都为:true
-
- //用于测试普通情况
- public class Test02 {
- public static void main(String[] args) {
- Student stu1 = new Student();
- Student stu2 = new Student();
- System.out.println(stu1==stu2);
- }
- }
- //结果为:false
饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。如果在构造方法里写了性能消耗较大,占时较久的代码,那么就会在启动的时候时间稍长
懒汉式是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量。使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。
单例模式三要素:
- 构造方法私有化
- 静态属性指向实例
public static
的getlnstance
方法,返回自己创建的静态属性