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

    关于单例模式,我们首先会想到其两种实现方式:饿汉式、懒汉式

    饿汉式:

    /**
     * 饿汉式单例模式
     */
    class Singleton{
        private static final Singleton singleton = new Singleton();
        private Singleton(){}
        public static Singleton getInstance(){
            return singleton;
        }
    }

    懒汉式(一般实现方式):

     1 /**
     2  *懒汉式单例模式--延迟加载 非线程安全
     3  */
     4 class Single{
     5     private static Single s = null;
     6     private Single(){}
     7     public static Single getInstance(){
     8         if(s == null){
     9             s = new Single();
    10         }
    11         return s;
    12     }
    13 }

    但是上面的饿汉式单例模式,如果在多线程调用的情况下,第8、9行就容易引发线程安全问题。

    为了解决这一问题,我们可以引入双重判断同步代码块解决:

    /**
     *懒汉式单例模式--线程安全
     */
    class Single{
        private static Single s = null;
        private Single(){}
        public static Single getInstance(){
            if(s == null){
                synchronized(Single.class){
                    if(s == null){
                        s = new Single();
                    }
                }
            }
            return s;
        }
    }

    事物总不是完美的,虽然例3解决了懒汉式单例模式的线程安全问题,但因为每一线程访问同步代码块时,都要对Single.class进行锁判断,相应的就牺牲了一部分性能。

  • 相关阅读:
    Daliy Algorithm (dp,模拟)-- day 80
    Daliy Algorithm (dp,堆)-- day 79
    Mybatis一级缓存和二级缓存 Redis缓存
    简单排序
    java一个大接口拆用多线程方式拆分成多个小接口
    集群环境下Shiro Session的管理
    递归和快速排序
    分布式定时任务
    Redis集群架构
    IO流
  • 原文地址:https://www.cnblogs.com/shindo/p/5313059.html
Copyright © 2011-2022 走看看