1.单例模式-创建型
2022-04-17 15:34:53 11 举报
AI智能生成
Java单例模式
作者其他创作
大纲/内容
单例模式
概述
1) 单例模式保证了 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能
2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
举例
饿汉式
1.1 静态常量
class Singleton {
//1、构造器私有化,外部不能new
private Singleton() {
}
//2、本类内部创建对象实例
private final static Singleton instance = new Singleton();
//3、提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
//1、构造器私有化,外部不能new
private Singleton() {
}
//2、本类内部创建对象实例
private final static Singleton instance = new Singleton();
//3、提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
1.2 静态代码块
class Singleton {
//1、构造器私有化,外部不能new
private Singleton() {
}
//2、静态代码块
private static Singleton instance;
static {
instance = new Singleton();
}
//3、提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
//1、构造器私有化,外部不能new
private Singleton() {
}
//2、静态代码块
private static Singleton instance;
static {
instance = new Singleton();
}
//3、提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
懒汉式
2.1 直接(线程不安全)
2.2 同步方法(线程安全)
2.3 synchroniezd同步代码块(线程安全)
2.4 双重校验: synchroniezd同步代码块(volatile + 双重判断)
class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
//提供一个静态的公有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
private static volatile Singleton instance;
private Singleton() {
}
//提供一个静态的公有方法,加入双重检查代码,解决线程安全问题,同时解决懒加载问题
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
枚举
enum EnumSingleton{
INSTANCE;
public EnumSingleton getInstance(){
return INSTANCE;
}
}
INSTANCE;
public EnumSingleton getInstance(){
return INSTANCE;
}
}
静态内部类
class SingletonDemo{
private SingletonDemo(){}
private static class SingletonInstance{
private static final SingletonDemo INSTANCE = new SingletonDemo(); // JVM 装载该内部类, 避免了指令重排
}
public static SingletonDemo getInstance(){
return SingletonInstance.INSTANCE;
}
}
private SingletonDemo(){}
private static class SingletonInstance{
private static final SingletonDemo INSTANCE = new SingletonDemo(); // JVM 装载该内部类, 避免了指令重排
}
public static SingletonDemo getInstance(){
return SingletonInstance.INSTANCE;
}
}
0 条评论
下一页