单例模式:指的是类 只能由自己生成唯一一个对象实例,并向其他对象提供这一实例。
实现单例模式有三种方法;常用的是所谓懒汉模式,与饿汉模式
1饿汉式:即在类在初始化的时候就已经自行实例化:
public class Singleton(){
// 定义私有的构造方法,所以外界无法定义方法
private Singleton(){}
// 自行实例化
private static final Singleton singleton = new Singleton();
// 静态工厂方法,用于提供对象实例
public static Singleton getInstance(){
return singleton;
}
}
2 懒汉式:
public class Singleton(){
// 定义私有的构造方法,所以外界无法定义方法
private Singleton(){}
// 不自行实例化,而是有调用静态工厂方法时候判断
private static Singleton singleton = null;
// 静态工厂方法,用于提供对象实例
public synchronized static Singleton getInstance(){
//若对象为空,则实例化对象
if (null == singleton) {
singleton = new Singleton();
}
return singleton;
}
}
在使用懒汉式的方法的时候,在静态方法上要加上synchronized关键字,防止线程安全问题,即由于多线程运行的条件下,会出现的多Singleton实例问题。
即当两个线程同时访问这个方法时,若没有synchronized关键字,则可能访问在第一个线程执行过判断语句并且还没有执行实例化语句的时候,第二个线程也执行了if判断语句
由此就会导致实例化语句执行两次。有了关键字synchronized,第一个线程访问这个方法的时候就会对方法进行加锁。防止了线程安全问题。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。