单例模式(singleton)

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

定义

     一个类只有一个实例,并且提供了全局的访问点。

 

理解

     当我们需要一个类只有一个实例的时候,用单例模式是个比较不错的选择,不用全局变量,是因为全局变量要在初始化的时候创建,太耗费资源,而单例模式只有用到的时候才创建实例

 

应用场景

      其实主要集中在管理共享资源的对象上,因为共享资源如果有多个对象操作,会很混乱。

      因此管理注册表的对象,管理线程池的对象等都可用单例

 

优点

     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;
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值