龙空技术网

深入理解java单例模式

程序员界的彭于晏 1770

前言:

当前看官们对“java中的单例”可能比较讲究,你们都想要学习一些“java中的单例”的相关资讯。那么小编同时在网摘上网罗了一些对于“java中的单例””的相关文章,希望你们能喜欢,我们一起来学习一下吧!

单例模式

单例模式: 一个类有且只有一个实例,且提供一个全局访问方法来访问这个实例。

核心点: 控制类实例数量

范围: 同一个JVM环境下

实现思路:

该实例类提供私有的构造函数,防止外部类创建该类实例

定义该类对象为私有且静态类型

提供一个全局可以访问该类实例的静态方法

饿汉式,这种模式大家都懂,废话不多说,上代码

缺点是在类加载的时候就实例化了对象,有点浪费空间,优点是线程安全,因为static变量会在类装载的时候初始化,并且多个实例的static变量会共享一块内存区域。

懒汉式,先有第一版:

但是由于线程不安全,于是加上了synchronized关键字修饰方法

加上锁以后又影响性能,于是又有了双锁检测(DCL)版本的单例模式

DCL版本的单例模式中,加入了volatile关键字,这个关键字有很重要的特性之一就是:volatile修饰的变量保证对所有线程可见性,它是java虚拟机提供的最轻量级别的同步机制。同时在getSingleton方法中,先判断了实例为空才加锁,所以DCL版本的单例模式既能相对提高性能,又能解决线程安全问题,但其中还是使用到了synchronized锁,无疑还是会产生点影响,于是我们又演化出了静态内部类的单例版本。

首先,我们知道类加载的时机有如下五种情况:

标签: #java中的单例