zoukankan      html  css  js  c++  java
  • 设计模式之单例模式

    参考http://blog.csdn.net/jason0539/article/details/23297037/

    概念:

          java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。

    单例模式有以下特点:
      1、单例类只能有一个实例。
      2、单例类必须自己创建自己的唯一实例。
      3、单例类必须给所有其他对象提供这一实例。

    饿汉式单例:饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

    public class Singleton{

      private Singleton(){}   

      private static Singleton insatnce=new Singleton();

      public static Singleton getInstance(){

        return insatnce;

      }

    }

    Singleton 类只有一个构造函数,它被private修饰,客户无法创建该类的实例。

    此实现是线程安全的,这是因为当JVM在加载此类时,对于static属性的初始化只能由一个线程执行且只执行一次。

    懒汉式单例:

      //懒汉式单例类.在第一次调用的时候实例化自己   

    1. public class LazySingleton {  
    2.     private LazySingleton() {}  
    3.     private static LazySingleton single=null;  
    4.     //静态工厂方法   
    5.     public static LazySingleton getInstance() {  
    6.          if (single == null) {    
    7.              single = new LazySingleton();  
    8.          }    
    9.         return single;  
    10.     }  
    11. }  

    懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全。

    1、在getInstance方法上加同步

    1. public static synchronized Singleton getInstance() {  
    2.          if (single == null) {    
    3.              single = new Singleton();  
    4.          }    
    5.         return single;  
    6. }  

    但是加synchronized会使得性能大不如前

    2、双重检查锁定

        private volatile static Singleton single=null;

    1. public static Singleton getInstance() {  
    2.         if (singleton == null) {    
    3.             synchronized (Singleton.class) {    
    4.                if (singleton == null) {    
    5.                   singleton = new Singleton();   
    6.                }    
    7.             }    
    8.         }    
    9.         return singleton;   
    10.     }  

    代码解释

     

    3、静态内部类

    1. public class Singleton {    
    2.     private static class LazyHolder {    
    3.        private static final Singleton INSTANCE = new Singleton();    
    4.     }    
    5.     private Singleton (){}    
    6.     public static Singleton getInstance() {    
    7.        return LazyHolder.INSTANCE;    
    8.     }    
    9. }    

    当JVM加载Singleton时,由于此类没有static,所以加载完成后就返回,只有在第一次调用getInstance时,JVM才会加载LazyHolder类,才会初始化Singleton。

  • 相关阅读:
    CTF---隐写术入门第二题 小苹果
    文件上传
    文件读取
    sqlmap之绕过waf思路
    【小技巧分享】如何通过微博图片进行社工Po主
    Windows 11恢复传统右键菜单-2021.10.5正式版
    sql注入之Oracle注入
    CTF之buuctf
    常见sql注入payload
    信息收集之Github
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/7727882.html
Copyright © 2011-2022 走看看