饿汉设计模式是在一开始就用static final修饰并且随着类加载就已经创建出的对象,是天生线程安全,但是存在对象未被使用的情况造成内存浪费。
懒汉设计模式是线程不安全的,需要通过synchronized关键字来进行线程安全处理。
package com.zhao.singleinstance;
public class SingleInstance1 {
//单利设计模式
//饿汉式——提前创建好一个该类的对象
//static修饰的随着类的加载而加载,final字符修饰的不可改变
//当测试类中加载该类时已经提前创建好了一个对象供其使用
private static final SingleInstance1 instance=new SingleInstance1();
//提供一个拿到单例的入口
public static SingleInstance1 getInstance(){
return instance;
}
//构造器
//必须私有化
private SingleInstance1(){
}
}
package com.zhao.singleinstance;
public class Test1 {
public static void main(String[] args) {
SingleInstance1 s1=SingleInstance1.getInstance();
SingleInstance1 s2=SingleInstance1.getInstance();
System.out.println(s1==s2);
//结果是true,说明两个地址拿到的是同一个对象,是单例对象
}
}
package com.zhao.singleinstance;
public class SingleInstance2 {
//单利设计模式
//懒汉式——不提前创建好对象,要的时候再给
//定义一个静态变量,用于存储一个对象即可
//因为是static修饰的,所以随着类的加载只会加载一次
private static SingleInstance2 instance;
//写一个静态方法,在当前没有已存在的该单例时,对外返回一个单例对象
public static SingleInstance2 getInstance(){
if (instance==null){
//此时说明是第一次来拿这个对象,那么就创建一个对象,并返回
SingleInstance2 instance=new SingleInstance2();
}
return instance;
}
//首先必须构造器私有化
private SingleInstance2(){
}
}
package com.zhao.singleinstance;
public class Test2 {
public static void main(String[] args) {
SingleInstance2 s1=SingleInstance2.getInstance();
SingleInstance2 s2=SingleInstance2.getInstance();
System.out.println(s1==s2);
//结果是true,说明两个地址拿到的是同一个对象,是单例对象
}
}