文档章节

线程安全的单例模式

东皇巴顿
 东皇巴顿
发布于 2017/03/22 23:16
字数 316
阅读 16
收藏 0

常见单例模式的解决方式:

public class Singleton {

    private Singleton() {

        System.out.println("Singleton is create");

    }

    private static Singleton instance = null;

    public static synchronized Singleton getInstance() {

        if (instance == null)

            instance = new Singleton();

        return instance;

    }

}

 

让instance只有在调用getInstance()方式时被创建,并且通过synchronized来确保线程安全。

这样就控制了何时创建实例。这种方法是延迟加载的典型。

 

但是有一个问题就是,在高并发的场景下性能会有影响,虽然只有一个判断就return了,但是在并发量很高的情况下,会有性能问题,因为都要去拿synchronized的锁。

 

为了高效,有了另一种方式:

public class StaticSingleton {

    private StaticSingleton(){  

        System.out.println("StaticSingleton is create");

    }

    private static class SingletonHolder {

        private static StaticSingleton instance = new StaticSingleton();

    }

    public static StaticSingleton getInstance() {

        return SingletonHolder.instance;

    }

}

由于加载一个类时,其内部类不会被加载。这样保证了只有调用getInstance()时才会产生实例,控制了生成实例的时间,实现了延迟加载。并且去掉了synchronized,让性能更优,用static来确保唯一性。

 

JDK1.5之后,Singletion的第三种实现,使用枚举:
//Enum Singletion  -  the preferred approach
      public enum Elvis {
          INSTANCE ;
          public void leaveTheBuilding() { …… }
      }
优势:代码简洁、无偿的提供了序列化机制。是实现Singletion 的最佳方法

© 著作权归作者所有

共有 人打赏支持
东皇巴顿
粉丝 3
博文 42
码字总数 57682
作品 0
海淀
技术主管
私信 提问

暂无文章

IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
今天
4
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
3
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
9
0
java多线程2

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在线程安全问题。这是因为方法内部的变量都是私有造成的。 synchronized 获取的都是对象锁。如果多个线程访问多个...

一滴水穿石
昨天
4
0
今天的学习

1,document.location.href:获取整个url 2,str.split(' '):用字符分割字符串 3,$this->load->library(' '):引用图像处理类 4,$this->load->library(' '):引用Email类 5,特殊访问指针$th......

墨冥
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部