一,为何要使用单列模式(引出单列模式)
有一些对象在应用系统中只应该出现一个实例,例如:处理日志的对象,线程池等等,如果出现多个,将会使程序产生异常,资源使用过量。
二,如何现实一个单列模式。
public class Singleton {
//第一步:在类中创建一个类本身的静态变量
private static Singleton singleton;
//第二步:将构造函数私有化
private Singleton(){ }
//第三步:提供统一的访问接口方法
public static Singleton getInstance(){
if(singleton == null)
{
singleton = new Singleton();//此种方式属于延迟实例化对象,真正用到时候,才实例化
}
return singleton;
}
public void showMsg(String name){
System.out.println(singleton.toString() + " 你好," + name);
}
}
三,单列模式在多线程中出现的问题,怎么解决。
问题:当有多个线程同时执行singleton = new Singleton()代码时,可能出现创建多个实例的情况。
解决方式如下:
1,使用synchronized关键字修饰公共访问方法来解决,但是此种方法降低系统的性能,如果不考虑性能问题,可以采用此种方式去处理。
public static synchronized Singleton getInstance(){
if(singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
2,采用“急切”方式去实例化对象。
public class Singleton {
//第一步:在类中创建一个类本身的静态变量
private static Singleton singleton = new Singleton();//急切方式实例化对象
//第二步:将构造函数私有化
private Singleton(){
}
//第三步:提供统一的访问接口方法
public static Singleton getInstance(){
return singleton;
}
public void showMsg(String name){
System.out.println(singleton.toString() + " 你好," + name);
}
}
3,采用“双重检查加锁”,在getInstance中减少同步。(此种方式本人不是特别理解)
public class Singleton {
//第一步:在类中创建一个类本身的静态变量
private volatile static Singleton singleton;
//第二步:将构造函数私有化
private Singleton(){ }
//第三步:提供统一的访问接口方法
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
public void showMsg(String name){
System.out.println(singleton.toString() + " 你好," + name);
}
}