Spring的IOC容器(容器中所有的实例bean唯一的)饿汉式单例模式 仍然可以根据反射破坏
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 饿汉式单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo1 {
//私有的静态的本类的实例private static SingletonDemo1 instance = new SingletonDemo1();//私有化的构造器private SingletonDemo1(){}//公开的静态的获得本类实例的方法public static SingletonDemo1 getInstance(){return instance;}
}
懒汉式单例
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 懒汉式单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例(用户多)
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo2 {
//私有的静态的本类的实例private static SingletonDemo2 instance;//私有化的构造器private SingletonDemo2(){System.out.println(Thread.currentThread().getName());}//公开的静态的获得本类实例的方法public static SingletonDemo2 getInstance(){if(instance == null){instance = new SingletonDemo2();}return instance;}
}
线程安全单例
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 线程安全的单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例(用户多)
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo3 {
//私有的静态的本类的实例private static volatile SingletonDemo3 instance;//私有化的构造器private SingletonDemo3(){System.out.println(Thread.currentThread().getName());}// 公开的静态的获得本类实nchr例的方法// 不能保证所有操作的原子性 - 加syonized锁**// 提高效率 - DCL double checked lock 双重检查锁**public static /*synchronized*/ SingletonDemo3 getInstance(){if(instance==null){//对象锁 SingletonDemo3.classsynchronized(SingletonDemo3.class){if(instance == null){instance = new SingletonDemo3();/*** instance = new SingletonDemo3(); 可能会发生指令重排* 1.创建引用instance* 2.开辟内存,存储对象* 3.将引用指向对象** 期望:123* 可能会发生:132... 直接将实例指向对象,但是对象未实例化** **解决方案:禁止指令重排,加'内存屏障',volatile****** 并发访问:可见性、原子性、重排性***** * volatile支持可见性、禁止重排性
synchronized 支持原子性*
*/}}}return instance;}
}
静态内部类的单例
package com.igeek.javase.pattern.singleton;
/**
@version 1.0
@Description 设计模式之一 - 单例模式 - 静态内部类的单例
@Author chenmin
@Date 2021/4/23 11:05
*
单例模式:整个应用中只存在唯一的实例
使用场景:业务场景(ATM银行实例是单例模式)、Spring的IOC容器(容器中所有的实例bean唯一的)等等
*
1.饿汉式单例
2.懒汉式单例(用户多)
*
线程安全
3.静态内部类的单例
4.线程安全的单例
*/
public class SingletonDemo4 {
//私有化的构造器private SingletonDemo4(){System.out.println(Thread.currentThread().getName());}//静态的内部类提供唯一实例static class SingleInnerClass{//私有的静态的本类的实例private static SingletonDemo4 instance = new SingletonDemo4();}//公开的静态的获得本类实例的方法public static SingletonDemo4 getInstance(){return SingleInnerClass.instance;}
}
