1.定义:
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并提供全局访问点。
2.单例的使用
教科书中的示例是很简单的,要想实现一个单例类,只需要三点:
1、定义私有的静态成员
2、私有化构造方法
3、提供公有的静态工厂方法
//单例模式 public class single { private String name; private static single si=null; single(){ //this.name=name; } public static single instance(){ if(si==null){ si= new single(); } return si; } public static void main(String[] args) { // TODO Auto-generated method stub single s=single.instance(); s.setName("hajsalfhj"); //single s1=new single(); single s1=single.instance(); System.out.println(s.getName()+s.equals(s1)); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.多线程问题
既然在软件运行期内只有一个实例,由于无法限制client的调用时机,就不可避免要处理互斥问题。
先来看静态工厂方法的互斥处理,典型的代码是:
public static Singleton getInstance(){
if (instance==null){
synchronized (Singleton.class) {
if (instance==null){
instance=new Singleton();
}
}
}
return instance;
}
这段代码既完成了在构造这个唯一实例时的保护,又在构造完以后的多次获取实例时不做无谓的互斥处理以提高运行效率,是目前比较推荐的实现方法。
再来看类的其他成员的互斥问题,这个就与其他class是一样的了,需要小心的处理多线程访问的影响。
4.内存回收
单例的内存问题也是值得关注的,一量单例创建以后,静态变量instance就会持有一份内存引用,而且由于其static性质,这份内存将在程序运行期间持续占用,无法通过GC进行回收。所以对内存敏感的程序要减少对单例的使用,或者妥善处理内存回收问题。