Java单例模式

2018-09-25  本文已影响0人  YXCheng

单例模式


一.单例模式介绍

单例模式是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的博客,这是去往该作者的 链接.

上一篇下一篇

猜你喜欢

热点阅读