模式动机:对于系统中的某些类来说,只有一个实例很重要。
若不唯一化:①显示内容一致的窗口,是浪费内存; ②显示内容不一致的窗口,意味着在某一瞬间系统有多个状态,与实际不符。比如:一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序列)生成器。
单例模式的要点:
①一个类只有一个实例---->私有化构造函数private
②它必须自行创建这个实例---->提供静态私有成员变量
③必须自行向整个系统提供这个实例---->提供一个公有的静态方法
懒汉模式:
第一次引用时将自己实例化,在懒汉式单例类被加载时不会实例化
class Singleton{
private static Singleton singleton=null;
public static Singleton getInstance(){
if (singleton==null){
singleton=new Singleton(); //第一次使用时进行实例化
}
return singleton;
}
private Singleton(){}
}
饿汉模式(线程安全)
在类加载时已经创建了单例对象
class Singleton{
private static Singleton singleton=new Singleton();
public static Singleton getInstance(){
return singleton;
}
private Singleton(){ }
}
线程同步处理:
当多个线程同时调用单个对象的方法时,一个线程可能会中断另一个线程正在执行的任务,使该对象处于一种无效状态。因为在单例模式中对象作为类变量被保存,而不是局部变量,所以并发访问这个对象时是在操作同一个对象。
synchronized同步方法:
使用synchronized关键字修饰方法,可以将方法声名为同步方法。可以确保当一个线程执行该方法时,该方法保持锁定状态,另一个线程不会进入该方法,直至锁定的方法被释放。
class Singleton{
private static Singleton singleton=null;
public static synchronized Singleton getInstance(){ //借助synchronized关键字
if (singleton==null){
singleton=new Singleton();
}
return singleton;
}
private Singleton(){}
}
借助内部类实现线程安全的单例模式:
class Singleton{
private static class InnerClass{
static Singleton instance=new Singleton();
}
public Singleton getInstance(){
return InnerClass.instance;
}
private Singleton(){
}
}