Java单例设计模式
编辑:本站更新:2025-01-15 07:10:07人气:6692
在软件工程领域,设计模式是解决常见问题的最佳实践和可重用解决方案。其中,“单例”(Singleton)是一种广泛应用于多线程环境、数据库连接池以及全局配置管理等场景的设计模式,在Java编程语言中更是得到了广泛应用。
**一、什么是单例设计模式**
“ Singleton ”设计模式的核心目标是在整个应用程序的生命周期内确保一个类只有一个实例,并提供一个访问该实例的全球点(即全局访问)。这意味着无论何时何地请求这个特定类型的对象时,都会返回相同的实例。
例如,在Java中实现单例通常采取以下形式:
public class Singleton {
// 创建 Singleton 类的一个对象
private static volatile Singleton instance;
/* 让构造函数为private,这样该类就不会被实例化 */
private Singleton() {}
/**
* 获取唯一可用的对象
*
* @return 单例对象
*/
public static synchronized Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
上述代码定义了一个名为`Singleton`的类,其内部有一个静态私有成员变量INSTANCE作为唯一的实例引用,并且将构造方法设为了私有的以防止外部直接通过new创建新的实例。对外提供的公共静态方法getInstance负责检查并初始化此单一实例。
**二、懒汉式与饿汉式的区别及优化**
1. **饿汉式:**
饿汉式是指在加载类的时候就完成了实例化工作。
public class SingletonHungry {
private final static SingletonHungry INSTANCE = new SingletonHungry();
private SingletonHungry(){}
public static SingletonHungry getInstance(){
return INSTANCE;
}
}
优点在于天生就是线程安全的;缺点则是即使程序从未使用过它也会消耗资源去进行预加载。
2. **懒汉式:**
懒汉式则会在真正需要获取实例时才完成实例化的操作:
上述第一个示例中的Singleton即是典型的Lazy-Loading型懒汉式单例,但是这种简单的双重检验加锁并不完全满足高并发下的性能要求——每次调用都同步会带来不必要的开销。
3. **双检锁定/volatile关键字改进版懒汉式:**
使用 `synchronized` 关键字虽然能保证了线程安全性但牺牲了一定效率,因此可以采用"double-checked locking"(DCL),仅当第一次检测到singleton尚未实例化时再执行同步块来进一步提高性能:
public class SingletonDoubleCheck{
private volatile static SingletonDoubleCheck singletonInstance;
private SingletonDoubleCheck (){}
public static SingletonDoubleCheck getSingletonObject(){
if(singletonInstance==null){
synchronized(SingletonDoubleCheck.class){
if(singletonInstance==null)
singletonInstance=new SingletonDoubleCheck();
}
}
return singletonInstance;
}
}
这里引入了`volatile`关键词用于禁止JVM指令重排序从而达到正确可见性和有序性的效果。
**三、枚举方式实现单例**
自Java 5开始还提供了另一种更简洁也更为高效的实现单例的方式 - 利用枚举类型(`Enum`)构建单例:
public enum EnumSingleton {
INSTANCE;
public void whateverMethod() {...}
}
这种方式不仅能够避免反射攻击破坏单例性,而且也是天然线程安全的,同时还能享受到序列号机制带来的便利。
总结起来,Java单例设计模式的应用体现了对系统资源的有效管理和控制,同时也展现了面向对象原则的重要思想之一 —— 封装,使得我们在处理诸如缓存、日志或DB连接这类只需要一份共享资源的情况更加得心应手。然而每种实现方案都有其适用范围和优劣考量,开发者需依据实际应用场景选择最适合的一种策略加以实施。
**一、什么是单例设计模式**
“ Singleton ”设计模式的核心目标是在整个应用程序的生命周期内确保一个类只有一个实例,并提供一个访问该实例的全球点(即全局访问)。这意味着无论何时何地请求这个特定类型的对象时,都会返回相同的实例。
例如,在Java中实现单例通常采取以下形式:
java
public class Singleton {
// 创建 Singleton 类的一个对象
private static volatile Singleton instance;
/* 让构造函数为private,这样该类就不会被实例化 */
private Singleton() {}
/**
* 获取唯一可用的对象
*
* @return 单例对象
*/
public static synchronized Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
上述代码定义了一个名为`Singleton`的类,其内部有一个静态私有成员变量INSTANCE作为唯一的实例引用,并且将构造方法设为了私有的以防止外部直接通过new创建新的实例。对外提供的公共静态方法getInstance负责检查并初始化此单一实例。
**二、懒汉式与饿汉式的区别及优化**
1. **饿汉式:**
饿汉式是指在加载类的时候就完成了实例化工作。
java
public class SingletonHungry {
private final static SingletonHungry INSTANCE = new SingletonHungry();
private SingletonHungry(){}
public static SingletonHungry getInstance(){
return INSTANCE;
}
}
优点在于天生就是线程安全的;缺点则是即使程序从未使用过它也会消耗资源去进行预加载。
2. **懒汉式:**
懒汉式则会在真正需要获取实例时才完成实例化的操作:
上述第一个示例中的Singleton即是典型的Lazy-Loading型懒汉式单例,但是这种简单的双重检验加锁并不完全满足高并发下的性能要求——每次调用都同步会带来不必要的开销。
3. **双检锁定/volatile关键字改进版懒汉式:**
使用 `synchronized` 关键字虽然能保证了线程安全性但牺牲了一定效率,因此可以采用"double-checked locking"(DCL),仅当第一次检测到singleton尚未实例化时再执行同步块来进一步提高性能:
java
public class SingletonDoubleCheck{
private volatile static SingletonDoubleCheck singletonInstance;
private SingletonDoubleCheck (){}
public static SingletonDoubleCheck getSingletonObject(){
if(singletonInstance==null){
synchronized(SingletonDoubleCheck.class){
if(singletonInstance==null)
singletonInstance=new SingletonDoubleCheck();
}
}
return singletonInstance;
}
}
这里引入了`volatile`关键词用于禁止JVM指令重排序从而达到正确可见性和有序性的效果。
**三、枚举方式实现单例**
自Java 5开始还提供了另一种更简洁也更为高效的实现单例的方式 - 利用枚举类型(`Enum`)构建单例:
java
public enum EnumSingleton {
INSTANCE;
public void whateverMethod() {...}
}
这种方式不仅能够避免反射攻击破坏单例性,而且也是天然线程安全的,同时还能享受到序列号机制带来的便利。
总结起来,Java单例设计模式的应用体现了对系统资源的有效管理和控制,同时也展现了面向对象原则的重要思想之一 —— 封装,使得我们在处理诸如缓存、日志或DB连接这类只需要一份共享资源的情况更加得心应手。然而每种实现方案都有其适用范围和优劣考量,开发者需依据实际应用场景选择最适合的一种策略加以实施。
www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源
PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。