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

    一、单例模式的定义

    单例模式:保证类只有一个实例,并提供一个它的全局访问点。

    二、单例模式的四种实现方式。

    大部分情况下用第一种就是最合适的。懒汉式通过延迟初始化,虽然减少了初始化类和创建对象的开销,但是增加了访问被初始化对象的开销。

    1.饿汉式:  饿汉式由于是在类被加载时就创建了实例,不会面临线程安全问题。但是它过早的就占用了系统的资源。

        public class Singleton  {

          private static Singleton singleton =new Singleton();

          private singleton(){}

          public static  Singleton getSingleton(){

          return singleton;

           }

        }

    2.懒汉式:懒汉式是在方法被调用时才会创建实例,实现了延迟加载,节约系统资源。但是在多线程环境下面临着线程安全的问题。需要加同步锁并且进行双重锁定的处理,才能保证线程的安全。

          注意:1.用volatile修饰singleton防止指令重排序。

              2.doubleCheck的作用:第二个防止创建多个实例。第一个是提升效率,生成了实例的直接返回不用再进入同步方法,同步方法效率低。

                               

          public class Singleton{

          private static  volatile Singleton singleton =null;

          private singleton(){}

          public static Singleton getSingleton(){

            if(singleton==null){    

              Syschronized(Singleton.class){

           if(singleton==null){

            singleton=new Singleton();

            }     

          }

        }

          return singleton;

      }

    }

    3.Holder单例模式:跟懒汉式类似,实现了延迟加载。但是将实例的初始化放入静态内部类中,从而保证了只创建一个实例。

    public class Singleton{

      private Singleton (){};

      public static Singleton getSingleton(){

       return Singleton.singleton;

    }

    public static class Singleton{

      private static Singleton singleton= new Singleton();

    }

    }

    4.枚举型单例模式:枚举实例的创建是线程安全的,在任何情况下都是一个单例

    public enum SingletonEnum {
    INSTANCE;
    }
    可以直接用
    SingletonEnum.INSTANCE调用。


  • 相关阅读:
    cookie和session的区别?
    请画出Servlet 2.2以上Web Application的基本目录结构
    简述HttpSession的作用、使用方法,可用代码说明
    Request对象的主要方法
    什么情况下调用doGet()和doPost()?
    SERVLET API中forward()与redirect()的区别?
    Servlet的基本架构
    说一说Servlet的生命周期
    解释一下什么是servlet?
    基数排序
  • 原文地址:https://www.cnblogs.com/yfy-/p/11809717.html
Copyright © 2011-2022 走看看