实战java设计模式--单例模式
程序员文章站
2022-05-04 23:06:06
目录1 介绍2 实现方式2.1 饿汉式(静态变量)2.2 饿汉式(静态代码块)2.3 懒汉式(线程不安全)2.4 懒汉式(线程安全)2.5 双重校验锁2.6 静态内部类方式2.7 枚举方式3 总结1 介绍单例模式属于创建型模式。单例模式创建的单例类只能有一个实例,并且是自己创建自己的唯一实例。使用场景:整个项目的配置类、项目的工具类等等。2 实现方式实现关键步骤:构造器私有化;(不让别人new)持有一个自己类型的引用;(怎么创建按照具体方法来)返回一个具体实例的方法;(给别人使用)同时...
目录
1 介绍
单例模式属于创建型模式。单例模式创建的单例类只能有一个实例,并且是自己创建自己的唯一实例。
使用场景:整个项目的配置类、项目的工具类等等。
2 实现方式
实现关键步骤:
- 构造器私有化;(不让别人new)
- 持有一个自己类型的引用;(怎么创建按照具体方法来)
- 返回一个具体实例的方法;(给别人使用)
同时关注两个问题:是否线程安全?是否支持懒加载?
2.1 饿汉式(静态变量)
//饿汉式
class Singleton{
//1.构造器私有化,别人不能new
private Singleton(){};
//2.本类内部创建对象实例
private final static Singleton instance = new Singleton();
//3. 提供一个共有的静态方法按返回实例
public static Singleton getInstance(){
return instance;
}
}
类加载时就初始化。
是否线程安全:是
是否支持懒加载:否
2.2 饿汉式(静态代码块)
//饿汉式(静态代码块)
class Singleton{
//私有变量
private static Singleton instance;
//1.构造器私有化,别人不能new
private Singleton(){}
//2.静态代码代码块里面创建
static {
instance=new Singleton();
}
//3. 提供一个共有的静态方法按返回实例
public static Singleton getInstance(){
return instance;
}
}
类加载时就初始化。
是否线程安全:是
是否支持懒加载:否
2.3 懒汉式(线程不安全)
//懒汉式(线程不安全)
class Singleton {
//私有变量
private static Singleton instance;
//1.构造器私有化,别人不能new
private Singleton() {
}
//2. 提供一个共有的静态方法按返回实例
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
是否线程安全:否
是否支持懒加载:是
2.4 懒汉式(线程安全)
//懒汉式(线程安全)
class Singleton {
//私有变量
private static Singleton instance;
//1.构造器私有化,别人不能new
private Singleton() {
}
//2. 提供一个共有的静态方法按返回实例
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在获得实例函数上加锁。
是否线程安全:是
是否支持懒加载:是
2.5 双重校验锁
懒汉式(线程安全)的方式虽然可线程安全,但是这样加锁效率较低。
//双重校验锁
class Singleton {
//私有变量
private static volatile Singleton instance;//注意关键字volatile
//1.构造器私有化,别人不能new
private Singleton() {
}
//2. 提供一个共有的静态方法按返回实例
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
双重校验体现在双重判断是否为空。
是否线程安全:是
是否支持懒加载:是
2.6 静态内部类方式
//静态内部类方式
class Singleton {
//1.构造器私有化,别人不能new
private Singleton() {
}
//2.静态内部类
private static class SingleInstance{
private static final Singleton INSTANCE=new Singleton();
}
//3. 提供一个共有的静态方法按返回实例
public static synchronized Singleton getInstance() {
return SingleInstance.INSTANCE;
}
}
在getInstance调用时才加载SingleInstance类。
是否线程安全:是
是否支持懒加载:是
2.7 枚举方式
//枚举方式
enum Singleton {
INSTANCE;
public void whateverMethod() {
System.out.println("ok!");
}
}
jdk 1.5之后才支持
是否线程安全:是
是否支持懒加载:否
3 总结
单例模式最重要的知识点在于其创建模式,要保证多线程安全的同时又能达到懒加载是最好的实现方式。
最易想到的应该是懒汉式(线程安全)的方法,但是对于静态代码块、静态内部类、枚举的骚操作也应该有所掌握。
本文地址:https://blog.csdn.net/weixin_44215363/article/details/109636770