一、单例模式介绍
- 确保一个类只有一个实例,而且自行实例并各整个系统提供这个实例,它会提供全局访问方法
二、单例的优缺点
2.1 主要优点
实例设置一个,有利于节省内存空间,可为整个程序框架提供共享变量,最高提供代码的重用性,可减少程序的命名空间
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
2.2 主要缺点
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
三、饿汉式-单例设计模式
//饿汉式
class Single{
private static final Single s=new Single();
private Single(){
}
public static Single getInstance(){
return s;
}
}
四、懒汉单例–单例设计模式
4.1 懒汉-线程不安全
public class JackSingletonOne {
private static JackSingletonOne instance;
private JackSingletonOne (){}
public static JackSingletonOne getInstance(){
if (instance == null) {
instance = new JackSingletonOne ();
}
return instance;
}
}
4.2 懒汉-线程安全
public class JackSingletonOne {
private static JackSingletonOne jackSingletonOne=null;
private JackSingletonOne(){
}
//synchronized
synchronized public static JackSingletonOne getInstance(){
if(jackSingletonOne==null){
jackSingletonOne=new JackSingletonOne();
}
return jackSingletonOne;
}
}
4.3 懒汉时延时加锁、可见性(推荐)
class JackSingletonOne {
private volatile static JackSingletonOne s = null;
private JackSingletonOne () {
}
public static JackSingletonOne getInstance() {
//双重判断,减少锁判断次数
if(s==null){
synchronized(JackSingletonOne.class){//使用的锁是所在类的字节码
if (s == null) {
s = new JackSingletonOne();
}
}
}
return s;
}
}
五、两种单例模式区别
5.1 相同点
在类创建的同时就创建好一个静态对象供系统使用,并且以后不再改变
扫描二维码关注公众号,回复:
2701026 查看本文章
5.2 不同点
饿汉单例是线程安全的
懒汉单例在创建实例对象时平加上synchronized则会导致对象的访问不是线程安全的