1、手写单例模式

1-1、手写单例模式-概述

  1. 1、手写单例模式-概述:
  2. 1-1、使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
  3. 1-2、私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
  4. 2、手写单例模式-实现方式:
  5. 2-1、懒汉式-线程不安全
  6. 2-2、饿汉式-线程安全
  7. 2-3、懒汉式-线程安全
  8. 2-4、双重校验锁-线程安全
  9. 2-5、静态内部类实现
  10. 2-6、枚举实现 ---推荐使用[!!!]

1-2、手写单例模式-Demo

1-2-1、饿汉式:

  1. /**
  2. * 饿汉式:静态常量-在类加载的时候就创建实例化
  3. */
  4. public class Singleton{
  5. private final static Singleton singleton = new Singleton()//final static修饰
  6. private Singleton(){} //构造器,private修饰
  7. public static Singleton getInstance(){ // static修饰, 静态方法返回实例
  8. return singleton;
  9. }
  10. }
  11. /**
  12. * 饿汉式:静态代码块方式实现
  13. */
  14. public class Singleton{
  15. private final static Singleton singleton;//final static修饰
  16. static { //静态代码块-类加载时就启动,只加载一次
  17. instance = new Singleton();
  18. }
  19. private Singleton(){} //构造器,private修饰
  20. public static Singleton getInstance(){ // static修饰, 静态方法返回实例
  21. return singleton;
  22. }
  23. }
  24. /**
  25. * 饿汉式:双重检查方式,线程安全,延迟加载,效率较高
  26. */
  27. public class Singleton{
  28. private static volatile Singleton singleton;//volatile修饰
  29. private Singleton(){} //构造器,private修饰
  30. public static Singleton getInstance(){ // static修饰, 静态方法返回实例
  31. if(singleton == null){
  32. synchronized(Singleton.class){ //synchronized
  33. if(singleton == null){
  34. singleton = new Singleton();
  35. }
  36. }
  37. }
  38. return singleton;
  39. }
  40. }
  41. /**
  42. * 饿汉式:静态内部类方式,JVM帮助我们保证了线程安全性
  43. */
  44. public class Singleton{
  45. private Singleton{}
  46. // 创建一个静态内部类,在静态内部类中去实例化对象
  47. private static class SingletonInstance{
  48. private static final Singleton singleton = new Singleton();
  49. }
  50. public static Singleton getInstance(){
  51. return SingletonInstance.singleton;
  52. }
  53. }
  54. /**
  55. * 静态内部类方法 创建单例模式,可能存在反射攻击或这反序列化攻击,如:反射攻击
  56. */
  57. public class Singleton{
  58. private Singleton{}
  59. // 创建一个静态内部类,在静态内部类中去实例化对象
  60. private static class SingletonInstance{
  61. private static final Singleton singleton = new Singleton();
  62. }
  63. public static Singleton getInstance(){
  64. return SingletonInstance.singleton;
  65. }
  66. public static void main(String[] args) throws Exception {
  67. Singleton singleton = Singleton.getInstance();
  68. Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
  69. constructor.setAccessible(true);
  70. Singleton newSingleton = constructor.newInstance();
  71. System.out.println(singleton == newSingleton); //运行结果是:false
  72. }
  73. }
  74. /**
  75. * 静态内部类方法 创建单例模式,可能存在反射攻击或这反序列化攻击,如:反序列化攻击
  76. 序列化反序列化依赖jar包:org.apche.commons.commons-langxxx.jar
  77. Singleton单例类实现java.io.Serializable接口
  78. */
  79. public class Singleton implements Serializable{
  80. //定义一个静态内部类
  81. private static class SingletonHanlder{
  82. private static Singleton singleton = new Singleton();
  83. }
  84. private Singleton(){}
  85. private static Singleton getInstance(){
  86. return SingletonHandler.singleton;
  87. }
  88. public static void main(String[] args) {
  89. Singleton instance = Singleton.getInstance();
  90. byte[] serialize = SerializationUtils.serialize(singleton);
  91. Singleton newInstance = SerializationUtils.deserialize(serialize);
  92. System.out.println(singleton == newInstance); //返回结果,false,两个实例不是同一个。
  93. }
  94. }
  95. /**
  96. * 枚举实现,可避免多线程同步问题,还能防止反序列化重新创建新的对象问题
  97. */
  98. public enum Singleton{
  99. singleton;
  100. //自定义方法,比如:work
  101. public void work{
  102. System.out.println("doWorking");
  103. }
  104. public static void main(String[] args){
  105. Singleton.singleton.work();//输出结果:doWorking
  106. }
  107. }

1-2-2、懒汉式:在真正需要的时候再去创建实例

  1. /**
  2. * 懒汉式:安全写法,
  3. volatile修饰实例,防止指令重排情况
  4. synchrinized锁住类实例,双重校验方式
  5. */
  6. public class Singleton{
  7. private static volatile Singleton singleton;
  8. privete Singleton{}
  9. public static Singleton getInstance(){
  10. if(singleton == null){
  11. synchronized(Singleton.class){
  12. if(singleton == null){
  13. singleton = new Singleton();
  14. }
  15. }
  16. }
  17. return singleton;
  18. }
  19. }

1-2-3、单例模式-实现方式-总结

Java-单例模式-Demo - 图1