• 实现单例的根本是私有化构造器


     实现单例的根本是私有化构造器(在类内部创建对象),然后根据不同的场景设计获取实例的方法,下面是几种常见的实现方式。

        1.饿汉式: 这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。 基于类加载机制实现可避免多线程的同步问题,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到延迟加载的效果。  

     View Code

        2.懒汉式:可实现延迟加载,但是多线程下存在致命问题。

     View Code

        3.改进的懒汉式(为解决线程同步问题),最简单的方法是对getInstance方法整体加关键字synchronized,但是这种实现方式效率会至少低2个数量级。其中一种不错的改进方式是双重检查模式(DCL),这种写法在getSingleton方法中对singleton进行了两次判空,第一次是为了不必要的同步,第二次是在singleton等于null的情况下才创建实例。在这里用到了volatile关键字,在这里使用volatile会或多或少的影响性能,但考虑到程序的正确性,牺牲这点性能还是值得的。DCL优点是资源利用率高,第一次执行getInstance时单例对象才被实例化,效率高。缺点是第一次加载时反应稍慢一些,在高并发环境下也有一定的缺陷(DCL失效),虽然发生的概率很小。

  • 相关阅读:
    (转)php读写文件
    CentOS5.2下安装GCC4.1.2
    使用php模拟post提交数据
    Linux系统信息查看命令大全
    强制卸载MYSQL
    Php文件操作
    redhat linux上安装 gcc编译器
    centos5.2安装mysql6.0
    如何收缩数据库日志文件(ldf)
    浑沌的JSON,JS Object,JS Array
  • 原文地址:https://www.cnblogs.com/zjw2004112/p/5964470.html
Copyright © 2020-2023  润新知