单例模式:是一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。
单例模式可以分为懒汉式和饿汉式:
懒汉式:在类加载时不初始化。
饿汉式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。
几种实现单例的方法:
内部枚举类实现
static静态代码块实现
静态内部类实现
饿汉式单例(立即加载方式)
懒汉式单例(延迟加载方式 使用synchronized同步锁)
下面我们举个栗子:
一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;售票时,一共有100张票,可有有多个窗口同时售票,但需要保证不要超售(这里的票数余量就是单例,售票涉及到多线程)。如果不是用机制对窗口对象进行唯一化将弹出多个窗口,如果这些窗口显示的都是相同的内容,重复创建就会浪费资源。
//使用synchronized同步锁
public class Singleton4 {
// 私有构造
private Singleton4() {}
private static Singleton4 single = null;
// 双重检查
public static Singleton4 getInstance() {
if (single == null) {
synchronized (Singleton4.class) {
if (single == null) {
single = new Singleton4();
}
}
}
return single;
}
}
synchronized同步锁或是用同步代码块对类加同步锁,此种方式虽然解决了多个实例对象问题,但是该方式运行效率却很低下,下一个线程想要获取对象,就必须等待上一个线程释放锁之后,才可以继续运行。