Java设计模式—单例模式
Posted 小筱萌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式—单例模式相关的知识,希望对你有一定的参考价值。
- 定义
保证只有一个实例存在,并提供一个访问它的全局访问点。
- 优点
1. 避免对共享资源的多重占用。
2. 节约系统资源,当需要频繁的去创建以及销毁一个对象时,该模式可以提高系统性能。
- 缺点
1. 没有抽象层,不利于扩展。不适用于变化的对象中
2. 职责过重,违反单一职责原则。
- 使用场景
数据库的连接池、多线程的连接池、日志文件的实现等。
- 具体实现
1. 为防止创建多个实例,构造函数进行私有化。
2. 建立一个类静态变量,持有一个自己的实例。
3. 通过静态方式对外部提供自己的实例。
- 对静态实例的初始化有以下几种方式
1. 饿汉式
优点:
1. 线程安全。因为类加载的方式是按需加载且只加载一次(在类进行初始化的时候其他线程是没办法进入的),所以该类只会被创建一个实例, 即JVM帮我们保证了饿汉模式天生就是线程安全的。
2. 在类加载的同时已经创建好了一个静态对象,调用时反应速度会很快。
缺点:
资源效率不高,可能getInstance()永远不会被执行到,但是执行该类的其他静态方法或者加 载了该类(class.forName),那么它仍然会被初始化,造成资源的浪费。
public class Instance {
private static Instance instance = new Instance();
//私有化构造函数
private Instance() {
}
public static Instance getInstance() {
return instance;
}
}
2. 懒汉式
优点:资源利用率高,在不执行getInstance()时不会被实例化,可以执行该类的其他静态方法。
缺点:线程不安全,在多线程条件下可能会创建多个实例。
public class Instance {
private static Instance instance;
//私有化构造函数
private Instance() {
}
public static Instance getInstance() {
if (instance == null) {
instance = new Instance();
}
return instance;
}
}
3. 双重检测锁DCL(推荐使用)
优点:线程安全、延迟加载、效率高。
该模式既能保证线程的安全,又能使性能不受到很大的影响,因为它只会在第一次创建实例的时候进行同步。
本模式创建的类静态变量通常用volatile关键字修饰,作用是保证该变量的可见性和原子性。
public class Instance {
private static volatile Instance instance;
//私有化构造函数
private Instance() {
}
public static Instance getInstance() {
if (instance == null) {
synchronized (Instance.class) {
if (instance == null) {
instance = new Instance();
}
}
}
return instance;
}
}
4. 静态内部类(推荐使用)
优点:线程安全,延迟加载,效率高。
该模式也采用了类装载机制来保证初始化实例时只有一个线程,且只有在调用getInstance()的时候才会装载Instance类。相比于饿汉方式有了Lazy-Loading的作用。
public class Instance {
//私有化构造函数
private Instance() {
}
private static class SignleInstance {
private static final Instance instance = new Instance();
}
public static Instance getInstance() {
return SignleInstance.instance;
}
}
以上是关于Java设计模式—单例模式的主要内容,如果未能解决你的问题,请参考以下文章