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

    单例模式有:饿汉,懒汉,静态内部类,枚举,双检锁(最优的就是枚举:没有为什么)
      1)饿汉:jvm加载类时,就加载了单例对象,造成了资源的浪费
        public class A{
          private A(){
          }
          private static A a = new A();
          public static A getInstance(){
            return a;
          }
        }

      2)懒汉:会有多线程同步问题(等被调用时才申明对象,且会申明一个静态的)
        public class A{
          private A(){
          }
          private static A a;

          public static A getInstance(){
            if(a==null)
              a=new A();
            return a;
          }
        }


        懒汉和饿汉最大的区别就是
        饿汉在类加载或程序启动时,类对象就被加载完成
        懒汉需等类被第一次初始化时,单例模式才会生成单例对象

      3)枚举:
        enum Single {
          Single;

          private Single() {
          }

          public void print(){
            System.out.println("hello world");
          }
        }

      
        public class SingleDemo {
          public static void main(String[] args) {
            Single a = Single.Single;
            a.print();
          }
        }


      4)加锁的:

        //同步函数的demo(将生成单例对象的方法加锁)
          优点:解决了多线程的同步问题
          缺点:本来只需在第一次初始化单例对象进行同步(防止生成多个对象),此方法需每一次调用都需同步,造成了性能问题
          public static synchronized Single1 getInstance() {   
            if (s == null)
              s = new Single1();

            return s;
          }

      
        //同步代码快的demo加锁,安全高效(双检锁),

          优点:也解决了多线程的同步问题,减缓了单锁的性能问题
          缺点:
          public static Single1 getInStanceBlock(){
            if(s==null)        //只有当对象为空时,在会造成同步效果,
              synchronized (Single1.class) {
                if(s==null)    //第二把锁是防止,其他线程在前一个线程创建完单例对象后,在重复创建
                  s = new Single1();
              }
            return s;
          }

    注意点:
    • 单例模式不会被jvm垃圾回收的
    • 实现单例模式需要私有构造器(防止外面在构造对象)、一个静态变量(用于保存单例对象)、一个静态方法(可以直接Class.方法调用)
    • 使用多个类加载器时,可能导致单例失效,产生多个实例,解决:自行指定类加载器,并指定同一个类加载器。

  • 相关阅读:
    JavaScript系列:《JavaScript高级程序设计》,chapter2, 在html中使用JavaScript
    Java系列:JVM指令详解(下)(zz)
    Java系列:JVM指令详解(上)(zz)
    Java系列:关于Java中的桥接方法
    REST: C#调用REST API (zz)
    Activiti系列:为什么Activiti 5.18 的REST的api总是返回404错误
    timeSeries db之:使用Metrics监控应用程序的性能 (zz)
    Java系列:国际化(zz)
    通过数据库方式访问excel 2007及其以后(xlsx)文件的连接字符串
    java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12539109.html
Copyright © 2011-2022 走看看