package cn.sdut.threadclass;
/**
* 单例模式: 饿汉式 懒汉式 枚举实现
* 饿汉式 :没有线程安全问题 利用反射机制可访问私有构造 不太安全
* 懒汉式 : 具有线程安全问题(进行了解决) 利用反射机制可访问私有构造 不太安全
* 枚举实现: 安全方便
*/
/*
* 创建 饿汉式: 1.私有化构造器 2.私有化 声明并创建实例 3.向外提供一个静态方法 返回创建的实例
*/
class Demo01 {
private static final Demo01 demo01 = new Demo01();
private Demo01() {
}
public static Demo01 getInstance() {
return demo01;
}
public void show(){
System.out.println(this.getClass().getName()+this.hashCode()+"饿汉式单例设计模式");
}
}
/*
* 创建 饿汉式: 1.私有化构造器 2.私有化 声明 3.向外提供一个静态方法 如果没有创建实例则创建并且返回创建的实例 , 如果创建了实例 就直接返回实例
*/
class Demo02 {
private volatile static Demo02 demo02;//使用volatile关键字
private Demo02() {
}
public static Demo02 getInstance() {
if (demo02 == null) { //检查一次
synchronized (Demo02.class) {
if (demo02 == null) { //"双重检查加锁"机制的实现 通常使用volatile关键字 。但是使用volatile会屏蔽掉一些优化机制 效率会降低
demo02 = new Demo02();
}
}
}
return demo02;
}
public void show(){
System.out.println(this.getClass().getName()+this.hashCode()+"懒汉式单例设计模式");
}
}
//用枚举方式定义单例模式
enum Demo03{
INSTANCE;
public void show(){
System.out.println(this.getClass().getName()+this.hashCode()+"枚举单例设计模式");
}
}
//测试
public class ThreadDemo04 {
public static void main(String[] args) {
Demo01 demo11 = Demo01.getInstance();
Demo01 demo12 = Demo01.getInstance();
demo11.show();
demo12.show();
Demo02 demo21 = Demo02.getInstance();
Demo02 demo22 = Demo02.getInstance();
demo21.show();
demo22.show();
Demo03 demo31 = Demo03.INSTANCE;
Demo03 demo32 = Demo03.INSTANCE;
demo31.show();
demo32.show();
}
}
单例设计模式:饿汉式、懒汉式、枚举方式。以及涉及到的线程安全问题和反射机制问题。
最新推荐文章于 2023-12-05 00:47:25 发布