定义
一个类只有一个实例,并且提供了全局的访问点。
理解
当我们需要一个类只有一个实例的时候,用单例模式是个比较不错的选择,不用全局变量,是因为全局变量要在初始化的时候创建,太耗费资源,而单例模式只有用到的时候才创建实例
应用场景
其实主要集中在管理共享资源的对象上,因为共享资源如果有多个对象操作,会很混乱。
因此管理注册表的对象,管理线程池的对象等都可用单例
优点
1.不用频繁的创建销毁对象,节约了系统资源,也节约了内存。
2.单例实现了对共享资源的管理访问,防止资源被多重占用。
类图

注意构建单例模式需要
1.一个私有的静态变量
2.一个私有的构造器(为了防止对象在类外被实例化,所以定义私有构造方法)
3.一个公有的静态方法(为了提供全局的访问点)
下面是几种构造器的创建方法,各有优劣,生活中根据自己需要创建合适的即可
· 普通构造器
package singleton;
public class CommonSingleton {
private static CommonSingleton instance;//一个静态变量
private CommonSingleton() { // 一个私有的构造器
}
public static CommonSingleton getSingleton(){//一个静态方法
if(instance==null){
instance=new CommonSingleton();
}
return instance;
}
}
带有同步锁的构造器
因为多线程并发访问时有可能导致创建的实例并不单一(只在初次创建实例的时候会引发这个问题),所以同步锁的作用就是每次只允许一个线程对该方法的访问,保证了单例,但由于创建实例只有一次,同步锁却每次访问都起作用,所以也很大程度限制了多线程的执行效率,使性能降低。
package singleton;
public class SynchronizedSingleton {
private static SynchronizedSingleton instance;
private SynchronizedSingleton() {
}
public static synchronized SynchronizedSingleton getSingleton(){
if(instance==null){
instance=new SynchronizedSingleton();
}
return instance;
}
}
·初始化创建
在jvm加载此类的时候就马上创建实例,好处是解决了多线程可能重复创建实例的问题,不过这增加了应用程序初始化过程中的负担(对于需要初始化负担不重的程序很适用)
package singleton;
public class InitSingleton {
private static InitSingleton instance=new InitSingleton();
private InitSingleton() {
}
public static InitSingleton getSingleton(){
return instance;
}
}
·
双重检查锁
对于既要解决多线程访问可能导致单例重复创建问题,又不想直接加锁(导致并发时性能降低),而且初始化时创建又占用系统初始化资源,所以这是一个适合的解决办法。
package singleton;
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton instance;
private DoubleCheckSingleton() {
}
public static DoubleCheckSingleton getSingleton(){
if(instance==null){
synchronized (DoubleCheckSingleton.class) {
if(instance==null){
instance=new DoubleCheckSingleton();
}
}
}
return instance;
}
}

本文介绍了单例模式的概念、实现方式及其在管理共享资源中的应用。单例模式确保一个类只有一个实例,并提供全局访问点,避免资源被多重占用,适用于注册表、线程池等场景。
444

被折叠的 条评论
为什么被折叠?



