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

    什么是单例模式?

      单例模式指的是 一个类 只产生 一个实例化对象

    目的(作用):

      保证在Java应用程序中,一个类Class只有一个实例存在。

    常见的模式:


      饿汉模式

      实现代码:

    public class SingleDemo0 {
    
        private static SingleDemo0 singleDemo0 = new SingleDemo0();
    
        private SingleDemo0(){}
    
        public static SingleDemo0 getInstance(){
            return singleDemo0;
        }
    
        public static void main(String[] args) {
            
            // 通过 静态方法取出 实例对象
            SingleDemo0 singleDemo0 = getInstance();
            System.out.println(singleDemo0);
        }
        
    }

      优点:

        1、仅实例化一次

        2、线程是安全的

        3、获取实例速度快

      缺点:类加载时立即实例化对象,实例化的对象不被使用,造成内存的浪费。


      懒汉模式

      实现代码:

    public class SingleDemo1 {
    
        private static SingleDemo1 singleDemo1 = null;
    
        private SingleDemo1(){}
    
        public static SingleDemo1 getInstance(){
            if( singleDemo1 == null ){
                return singleDemo1 = new SingleDemo1();
            }
            return singleDemo1;
        }
    
        public static void main(String[] args) {
            // 获取 实例对象
            SingleDemo1 singleDemo1 = getInstance();
            System.out.println(singleDemo1);
        }
        
    }

      优点:

        1、获取实例时才进行实例的初始化,节省系统资源

      缺点:

        1、非线程安全

        2、系统开销大(每一次获取都需要进行非空检查)


    让 懒汉模式 变得 线程安全 (  双重检查锁 )

      实现代码:

    public class SingleDemo2 {
    
        private static volatile SingleDemo2 singleDemo2 = null;
    
        private SingleDemo2(){}
    
        public static SingleDemo2 getInstance(){
            if( singleDemo2 == null ){
                synchronized (SingleDemo2.class){
                    if( singleDemo2 == null ){
                        return new SingleDemo2();
                    }
                }
            }
            return singleDemo2;
        }
    
    }

      内部类实现方式

    public class SingleDemo3 {
    
        private SingleDemo3(){}
        
        private static class getSingleDemo3Class{
            private static SingleDemo3 singleDemo3 = new SingleDemo3();
        }
    
        public static SingleDemo3 getInstance(){
            return getSingleDemo3Class.singleDemo3;
        }
    
    }

      优点:

        1、内部类只有在外部类被调用才加载,从而实现延迟加载

        2、线程安全,且不用加锁

  • 相关阅读:
    实用C语言技巧
    ASP.NET的适配器设计模式(Adapter)
    MongoDB的管理
    WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
    dreamhappy博客索引
    Namenode的介绍
    asp.net
    学习
    采用Mono进行移动开发图书推荐
    VS2010+C#写的3D
  • 原文地址:https://www.cnblogs.com/oukele/p/12939830.html
Copyright © 2011-2022 走看看