设计模式之——单例模式

Posted Java老僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之——单例模式相关的知识,希望对你有一定的参考价值。

福利干货第一时间送达!



一. 什么是单例模式


单例模式 (Sigleton Pattren)是我们在java应用中最常用的一种设计模式,它所创建的单例对象能够保证在一个 JVM 中,该对象只有一个实例的存在,同时也可以提供一个可以访问它全局的一个点。

二. 有何优点

单例模式 主要解决的是某些频繁创建与销毁,省去了创建对象的 new 操作符,降低了内存的使用频率,减轻了GC的压力。

三. 初尝单例

1. 我们先创建一个简单的单例类


 1public class Singleton {
2
3    // 私有静态实例 这样就能不被引用 为实现延迟加载 我们赋值null
4    private static Singleton instance = null;
5    // 让构造函数为 private,这样该类就不会被实例化
6    private Singleton() {
7    }
8    //创建实例
9    public static Singleton getInstance() {
10        if (instance == null) {
11            instance = new Singleton();
12        }
13        return instance;
14    }
15    public void saySingleton() {
16        System.out.println("Hello Singleton");
17    }
18}


2. 创建测试

1public class SingletonTest {
2    public static void main(String[] args) {
3        Singleton object = Singleton.getInstance();
4        object.saySingleton();
5    }
6}


3. 测试结果为


1Hello Singleton


四 . 发现问题


1. 我们发现上面创建的这个类基本满足我们的要求,但是如果像上面这样写,在多线程的环境下,肯定会出现一些问题。

2. 我们将对代码进行一下的改进,我们使用 synchronized 就能保证线程的安全,但是这样也会影响代码的效率,这种也被称为 懒汉式,线程安全 实现单例模式。相反的我们之前创建的称为 懒汉式,线程不安全


1    //创建实例
2    public static synchronized Singleton getInstance() {
3        if (instance == null) {
4            instance = new Singleton();
5        }
6        return instance;
7    }


3. 我们又开始解决像懒汉式,线程安全这种虽然使用了synchronized保证了线程安全但又在性能上的下降,于是我们用双检锁/双重校验锁创建,采用这种双锁机制,我们的程序就能安全的在多线程的环境下保持较高性能,我们将代码修改如下。


 1    public static Singleton getInstance() {
2        if (instance == null) {
3            synchronized (instance) {
4                if(instance == null){
5                    instance = new Singleton();
6                }
7            }
8        }
9        return instance;
10    }


4. 讲完了上面几种我们在说一下还有一种称为饿汉式创建单例对象实现方式,这种方式没有synchronized,执行效率比较高,但它在类加载的时候就初始化,比较浪费系统资源。


1public class Singleton {
2
3    private static Singleton instance = new Singleton();
4    private Singleton() {
5    }
6    public static Singleton getInstance() {
7        return instance;
8    }
9}  
  


五. 总结 

 

通过单例模式的学习,我们知道了单例模式虽然理解起来简单但,但是具体实现起来还是有一定的难度,我们要通过设计模式的学习去掌握代码设计的思维这样我们才会不断的提高。



老僧终于写完了,忘了告诉大家公众号回复” 57 “领取老僧精心准备的全套学习资料!快点学起来吧! 感谢您一直的关注!奥利给!


END

设计模式之(4)——单例模式
设计模式之(4)——单例模式





点击“阅读原文”

以上是关于设计模式之——单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式

设计模式之单例模式以及简单代码实现

Java设计模式之单例模式

设计模式之单例设计模式

代码操作中经常使用到设计模式之单例模式

设计模式之单例模式