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

    单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点!

    1.懒汉式单例模式:

     1 public class Singleton {
     2      //懒汉式单例模式
     3     private  static  Singleton instance;
     4 
     5     //将构造方法设置成private,堵死了外界利用new创建此类实例的可能
     6     private Singleton(){};
     7 
     8     //synchronized  单线程可不用同步
     9     public static synchronized  Singleton  getSingleton(){
    10 
    11         if(instance==null){
    12             instance =new Singleton();
    13         }
    14         return instance;
    15     }
    16 
    17 }
    懒汉式单例模式的缺点:1、效率比较低 2.在多线程高并发的情况下,线程不安全。(第一次被引用的时候创建实例)

    2.饿汉式单例模式
    1     private static Singleton instance = new Singleton();  
    2     private Singleton (){}  
    3     public static Singleton getInstance() {  
    4     return instance;  
    5     }  
    饿汉式单例模式的缺点:这种静态初始化的方式在自己被加载时就将自己实例化。解决了多线程环境下不安全的问题。无需开发人员显式的编写线程安全代码。

    3.双重锁定效验的单例模式:
     1 public class Singleton {
     2     private volatile static Singleton singleton;
     3     private Singleton (){}
     4     public static Singleton getSingleton() {
     5     if (singleton == null) {
     6         synchronized (Singleton.class) {
     7         if (singleton == null) {
     8             singleton = new Singleton();
     9         }
    10         }
    11     }
    12     return singleton;
    13     }
    14 }

    这样方式实现线程安全地创建实例,而又不会对性能造成太大影响。它只是第一次创建实例的时候同步,以后就不需要同步了。

    由于volatile关键字屏蔽了虚拟机中一些必要的代码优化,所以运行效率并不是很高,因此建议没有特别的需要不要使用。双重检验锁方式的单例不建议大量使用,根据情况决定。

  • 相关阅读:
    解析库之 beautifulsoup模块
    请求库之 selenium模块
    请求库之 requests模块
    一句话
    JPA学习03
    JPA学习02
    JPA学习01
    SpringData学习04
    SpringData学习03
    SpringData学习02
  • 原文地址:https://www.cnblogs.com/taochen-go/p/9662845.html
Copyright © 2011-2022 走看看