zoukankan      html  css  js  c++  java
  • OOAD之单例模式Singleton的6种写法

    1  主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 

    一 :第一种 饿汉式(预加载)

     1 public class Singleton {  
     2    private Singleton(){}////在自己内部定义自己一个实例,注意这是private 
     3     private static Singleton instance = new Singleton();  
     4   
     5     public static Singleton getInstance() {  
     6     return instance;  
     7     }  
     8 
     9      public static void main(String[] args) {
    10     Singleton sing=Singleton.getInstance();
    11     System.out.println(sing);
    12   }
    13 }  

    二:第二种 饿汗式(变种)

     1 public class Singleton {  
     2      private Singleton (){}  
     3     private Singleton instance = null;  
     4     static {  
     5     instance = new Singleton();  
     6     }  
     7     
     8     public static Singleton getInstance() {  
     9     return this.instance;  
    10     }  
    11    public static void main(String[] args) {
    12     Singleton sing=Singleton.getInstance();
    13     System.out.println(sing);
    14 }
    15 }  

    三:第三种 懒汉式(懒加载 线程不安全

     1 public class Singleton {  
     2     private Singleton(){}
     3     private static Singleton instance;  
     4   
     5     public static Singleton getInstance() {  
     6     if (instance == null) {  
     7         instance = new Singleton();  
     8     }  
     9     return instance;  
    10     }  
    11 
    12     public static void main(String[] args) {
    13     Singleton sing=Singleton.getInstance();
    14     System.out.println(sing);
    15 }
    16 }  

    四:第四种 懒汉式(单线程安全)

     1 public class Singleton {
     2     private Singleton(){}  
     3     private static Singleton instance;  
     4   
     5     public static synchronized Singleton getInstance() {  
     6     if (instance == null) {  
     7         instance = new Singleton();  
     8     }  
     9     return instance;  
    10     }  
    11 
    12    public static void main(String[] args) {
    13     Singleton sing=Singleton.getInstance();
    14     System.out.println(sing);
    15 }
    16 }  

    五:第五种  静态内部类

     1 public class Singleton { 
     2     private Singleton (){}  
     3     private static class SingletonHolder {  
     4     private static final Singleton INSTANCE = new Singleton();  
     5     }  
     6     
     7     public static final Singleton getInstance() {  
     8     return SingletonHolder.INSTANCE;  
     9     } 
    10    //因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。
    11     
    12 }  

    六:第六种  双重校验锁

     1 public class Singleton {  
     2     private volatile static Singleton instance=null;  
     3     private Singleton (){}  
     4     public static Singleton getInstance() {  
     5     if (instance== null) {  
     6         synchronized (Singleton.class) {  
     7         if (instance== null) {  
     8             instance= new Singleton();  
     9         }  
    10         }  
    11     }  
    12     return instance;  
    13     }  
    14 } 

    这种方式只是在初始化Singleton那部分代码的时候添加同步锁,这样提高了效率。

  • 相关阅读:
    和为S的连续正数序列
    数组中的逆序对
    剑指offer:数组中出现次数超过一半的数字
    剑指offer12:矩阵中的路径
    剑指offer(62):孩子们的游戏(圆圈中最后剩下的数)约瑟夫环问题
    剑指offer41:数据流中的中位数
    剑指offer56:数组中只出现一次的数字
    不用加减乘除做加法
    输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可
    求树的高度
  • 原文地址:https://www.cnblogs.com/hellokitty1/p/4643907.html
Copyright © 2011-2022 走看看