单例设计模式的实现
1饿汉式
饿汉式就是一上来就创建对象,并且保证以后每次使用的对象都是同一个对象
package cn.tedu.design;
/**本类用于测试单例设计模式1-饿汉式*/
public class Singleton1 {
public static void main(String[] args) {
//6.通过类名直接调用get方法
MySingle single = MySingle.getSingle();
MySingle single2 = MySingle.getSingle();
//7.测试引用类型变量保存的地址值是否一致
System.out.println(single == single2);//true
System.out.println(single);
System.out.println(single2);
}
}
//1.创建自己的单例程序
class MySingle{
//1.提供构造方法,并将构造方法私有化
/**1.构造方法私有化的目的:
* 为了不让外界随意的实例化对象/new本类对象*/
private MySingle(){ }
//2.在本类内部创建对象,并把对象私有化
//5.2本资源也需要用static修饰,因为静态方法getSingle()只能调用静态资源
static private MySingle single = new MySingle();
/**
* 2.思考:对象已经创建好,并且可以用公共的方式返回
* 那外界如何调用这个公共的方法呢?
* 之前我们都是创建好本类对象,通过对象进行调用
* 但是现在无法在外部创建本类对象,解决方案:
* 我们可以利用静态,被static修饰的资源可以被类名直接调用
* */
//3.对外提供一个公共的get(),返回本类对象给调用者
//5.1用static修饰此方法,后续可以通过类名直接调用
static public MySingle getSingle() {
//4.把本类创建好的对象返回
return single;
}
}

2懒汉式
1.延迟加载的思想:是指不会在第一时间为你加载资源(创建对象)而是等到你需要的时候,再帮你去加载资源(创建对象)
2.线程安全问题:多线程场景+共享数据+多条语句操作此共享数据
解决方案:加锁(同步代码块/同步方法)
3.饿汉式与懒汉式的区别:
饿汉式是不管你需不需要本类对象,先帮你创建出来
懒汉式是先不给你创建这个类的对象,等到你需要的时候再帮你创建-延迟加载
public class Singleton2 {
public static void main(String[] args) {
//10.测试单例的实现方式
MySingle2 single = MySingle2.getMySingle2();
MySingle2 single2 = MySingle2.getMySingle2();
System.out.println(single == single2);
System.out.println(single);
System.out.println(single2);
}
}
//1.创建自定义单例类
class MySingle2{
//2.私有化构造方法--为了防止外界调用此构造创建对象
private MySingle2(){}
/**问题:程序中有共享资源single,并且有多条语句操作了共享资源
* 此时共享资源single会出现多线程数据安全隐患
* 解决方案:加锁-同步代码块-同步方法
* (如果本方法中所有代码都被同步了,可以把本方法修饰成同步方法)
* 锁的位置:包裹所有操作共享资源的语句
* 锁对象:外部创建的Object对象是静态的 & 静态区域中不可以使用this
* */
//3.在类的内部创建一个引用类型变量--注意私有化--延迟加载
//9.2本资源也需要使用静态修饰,因为静态资源只能调用静态
static private MySingle2 single;
//定义锁对象
static Object o=new Object();
//4.对外提供全局访问点--对外提供公共的get(),返回本类对象
//5.当用户调用此方法时,才说明需要本类对象了,再返回
//9.1本方法使用静态修饰,方便通过类名直接调用
synchronized static public MySingle2 getMySingle2(){
/**静态区域内,不能使用this关键字,因为静态资源优先于对象进行加载
* 静态资源属于类资源,随着类的加载而加载,而this代指本类对象* */
synchronized (o){
if(single==null){
single=new MySingle2();
}
return single;
}
}
}

本文详细介绍了单例设计模式中的两种实现方式:饿汉式和懒汉式。饿汉式在类加载时就创建对象,确保唯一性;懒汉式采用延迟加载思想,在首次请求时创建对象。文中通过具体代码示例解释了每种方式的特点及应用场景。

1152

被折叠的 条评论
为什么被折叠?



