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 {

  1. //私有的静态的本类的实例
  2. private static SingletonDemo1 instance = new SingletonDemo1();
  3. //私有化的构造器
  4. private SingletonDemo1(){
  5. }
  6. //公开的静态的获得本类实例的方法
  7. public static SingletonDemo1 getInstance(){
  8. return instance;
  9. }

}

懒汉式单例

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 {

  1. //私有的静态的本类的实例
  2. private static SingletonDemo2 instance;
  3. //私有化的构造器
  4. private SingletonDemo2(){
  5. System.out.println(Thread.currentThread().getName());
  6. }
  7. //公开的静态的获得本类实例的方法
  8. public static SingletonDemo2 getInstance(){
  9. if(instance == null){
  10. instance = new SingletonDemo2();
  11. }
  12. return instance;
  13. }

}

线程安全单例

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 {

  1. //私有的静态的本类的实例
  2. private static volatile SingletonDemo3 instance;
  3. //私有化的构造器
  4. private SingletonDemo3(){
  5. System.out.println(Thread.currentThread().getName());
  6. }
  7. // 公开的静态的获得本类实nchr例的方法
  8. // 不能保证所有操作的原子性 - 加syonized锁
  9. **// 提高效率 - DCL double checked lock 双重检查锁**
  10. public static /*synchronized*/ SingletonDemo3 getInstance(){
  11. if(instance==null){
  12. //对象锁 SingletonDemo3.class
  13. synchronized(SingletonDemo3.class){
  14. if(instance == null){
  15. instance = new SingletonDemo3();
  16. /**
  17. * instance = new SingletonDemo3(); 可能会发生指令重排
  18. * 1.创建引用instance
  19. * 2.开辟内存,存储对象
  20. * 3.将引用指向对象
  21. *
  22. * 期望:123
  23. * 可能会发生:132... 直接将实例指向对象,但是对象未实例化
  24. *
  25. * **解决方案:禁止指令重排,加'内存屏障',volatile**
  26. *
  27. *** 并发访问:可见性、原子性、重排性**
  28. *
  29. ** * volatile支持可见性、禁止重排性

synchronized 支持原子性*

  1. */
  2. }
  3. }
  4. }
  5. return instance;
  6. }

}

静态内部类的单例

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 {

  1. //私有化的构造器
  2. private SingletonDemo4(){
  3. System.out.println(Thread.currentThread().getName());
  4. }
  5. //静态的内部类提供唯一实例
  6. static class SingleInnerClass{
  7. //私有的静态的本类的实例
  8. private static SingletonDemo4 instance = new SingletonDemo4();
  9. }
  10. //公开的静态的获得本类实例的方法
  11. public static SingletonDemo4 getInstance(){
  12. return SingleInnerClass.instance;
  13. }

}