美文网首页
Java单例模式

Java单例模式

作者: YXCheng | 来源:发表于2018-09-25 21:09 被阅读0次

    单例模式


    一.单例模式介绍

    单例模式是Java二十三种设计模式中的一种,也是一种比较常用的设计模式。其作用是保证该类只能拥有一个实例对象。

    二.实现步骤

    1.私有化该类的构造方法,让其他类无法通过构造器创建该类的实例。
    2.提供可以获取到该类实例的静态方法,让其他类通过该方法获取到该类的实例。

    三.写法介绍

    1.饿汉式

    1.1 介绍

    因为该类的实例是在类加载的时候就创建出来的,并不是在使用的时候。就像被饿了很久的人见到吃的,不管三七二十一,先填饱肚子再说。所以把这种写法叫做饿汉式。

    1.2 Java代码

        public class Test{
            //本类持有本类的引用
            private static Test mInstance = new Test();
            
            //将构造方法私有化
            private Test(){
            
            }
            
            //提供一个对外的方法获取本类的引用
            public static Test getInstance(){
                return mInstance;
            }
        }
    

    1.3 优缺点

    优点:写法简单,线程安全,避免了线程同步的问题。
    缺点:因为实例是在类加载的时候初始化,所以它的生命周期是和类相同。即使它从未被用到,也不会被系统回收,造成内存的浪费。
    可以但是不推荐使用饿汉式。

    2.懒汉式(基本写法)

    2.1 介绍

    该写法是只有在使用的时候才进行实例创建。就像一个懒汉只有当饿了的时候才去吃饭。

    2.2 Java代码

        public class Test{
            private static Test mInstance;
            
            private Test(){
            }
            
            public static Test getInstance(){
                if(null = mInstance){
                    mInstance = new Test();
                }
                return mInstance;
            }
        }
    

    2.3 优缺点

    优点:当使用的时候才进行实例化,不会造成内存的浪费。起到了Lazy Loading的效果。
    缺点:在单线程该写法没有问题。但是在多线程情况下,是线程不安全的。
    不推荐使用该写法。

    3.懒汉式(同步方法)

    3.1 介绍

    为了解决懒汉式的线程不安全问题,把getInstance()方法进行线程同步。

    3.2 Java代码

        public class Test{
            private static Test mInstance;
            
            private Test(){
            
            }
            
            public static synchronized Test getInstance(){
                if(null == mInstance){
                    mInstance = new Test();
                }
                return mInstance;
            }
        
        }
    

    *3.3 优缺点

    优点:解决了线程安全问题。
    缺点:同步效率低。每次调用getInstance方法时都要进行同步。但实际上只有当mInstance == null时才有同步的必要,不为null时直接return就OK了。
    不推荐使用。

    4.懒汉式(同步代码块)

    4.1 介绍

    为了解决同步方法效率低而产生的写法。

    4.2 代码

        public class Test{
            private static Test mInstance;
            
            private Test(){
            
            }
            
            public static Test getInstance(){
                if(null == mInstance){
                    synchronized(Test.class){
                        mInstance = new Test();
                    }
                }
                return mInstance;
            }
            
        }
    

    4.3 优缺点

    和传统的懒汉式基本没区别。都是线程不安全。
    不推荐使用。

    5.懒汉式(双重检查)

    5.1 介绍

    在同步方法的基础上再进行改良的。

    5.2

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

    5.3 优缺点

    优点:这种懒汉式的写法用到了Double-Check。进行了两次非空判断,保证了线程安全,并且只实例化的一次代码。该写法线程安全,延迟加载,效率高。
    缺点:无。
    推荐使用。

    6.静态内部类

    6.1 介绍

    静态内部类跟饿汉式方式采用的机制类似,但又不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的是饿汉式在类被装载时被实例化,没有Lazy Loading的作用。而静态内部类方式在类被装载时并不会实例化,而是在需要实例化时,才会调用。

    6.2 代码

        public class Test{
            private Test(){
            
            }
            
            private static class SingletonInstance{
                private static final Test INSTANCE = new Test();
            }
            
            public static Test getInstance(){
                return SingletonInstance.INSTANCE;
            }
        
        }
    

    6.3 优缺点

    优点:利用类的静态属性保证唯一性,JVM保证线程安全,延迟加载,效率高。
    推荐使用。

    7.枚举

    7.1 代码

        public enum Test{
            INSTANCE;
            public void whateverMethod(){
            
            }
        }
    

    本文章参考了CSDN的博客,这是去往该作者的 链接.

    相关文章

      网友评论

          本文标题:Java单例模式

          本文链接:https://www.haomeiwen.com/subject/ivcroftx.html