1.简介:
单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中某个类只有一个实例而且该实例易于外界访问,防止实例存在多个引起程序逻辑错误,同时还能方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
2.实现:
为了实现单例设计模式需要保证:
1.某个类只能有一个实例,要禁止其他程序建立该类对象;
2.为了别的类能够访问到该类对象,它必须自行创建这个对象;
3.为了方便别的类进行访问,它必须对外提供访问方式。
各步具体实现:
1.将构造函数私有化;
2.在该类中定义一个静态的私有对象(方便下面的静态方法调用)
3.在类中提供一个静态的公有的函数用于获取它本身的静态私有对象(静态函数方便别的类在没有对象的情况下用类名.方法的方式实例化唯一的对象)。
3.实例:
1.饿汉式:不管是否用得上,一开始就建立这个单例对象(实际应用中多使用这个方式)
public class Singleton{
private static Singleton p = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return p;
}
}
2.懒汉式:getInstance()方法被调用时才初始化对象,也叫作对象的延时加载
public class Singleton{
private static Singleton p=null;
private Singleton(){}
public static getInstance()
{
if(p==null)
{
p=new Singleton();
}
return p;
}
}
事实上,这种懒汉式方法在并发环境下很可能出现多个Singleton的实例,所以可以使用synchronized锁的方式,避免多线程访问时,可能造成的重复初始化问题
public static class Singleton{
private static Singleton p=null;
private Singleton(){}
public static Singleton getInstance(){
if(p==null){
synchronized(Singleton.class){
if(p==null){
p=new Singleton();
}
}
}
return p;
}
}
这样,如果一个对象已经被创建,则不会进入第一个if判断,也不会调用synchronized方法,避免因调用该方法造成效率降低;
而如果没有对象被创建,p进入第一个if判断后,synchronized将线程阻塞,确保第二个创建对象的请求无法得到满足,第一个对象创建完成后锁被打开,此时p不为空,第二个创建对象的请求无法进入第二个if判断。
这种双重if加锁的方式,严格保证了只创建一个类的实例