一、含义
在一个系统中,确保一个类只有一个实例,并提供一个全局访问点,这个类在系统中是独一无二的。
二、要点
1.单例模式确保程序中最多只有一个这个类的实例。
2.在java中实现单例模式需要把构造器私有化,并提供一个静态方法和静态变量。
三、分析单例模式
首先来看一下最经典的单例模式的代码如下:
public class Singleton {
//利用一个静态变量来保存Singleton类的唯一实例
private static Singleton instance;
//将构造器私有化
private Singleton() {
}
//使用这个方法来实例对象,并对外提供访问
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
上诉方法,就是单例模式的懒汉式,也就是说当没有外部方法调用这个类的getInstance()方法事,这个类事不会被实例化的,只有在调用这个方法后,这个类才会被实例化。
上诉单例模式,在多线程中可能会实例化类,因为在多线程中,可能会有多个线程进入if条件的判断,这个时候,就会实例化多个对象,解决这个问题,就是需要将这个方法进行同步处理,每次最多只能有一个线程进入,修改后的代码如下:
//使用这个方法来实例对象,并对外提供访问,加上synchronized,进行同步处理
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
但是将整个方法进行同步之后,那么带来的问题就是会影响程序的性能,因为单例模式是进行一次实例化的操作,所以只是在第一次调用的时候,需要进入if的条件,一旦实例化后,就不会在进入if的判断条件,那么就可以使用单例模式的另一种写法,就是饿汉式,就是不管这个对象有没有在程序其它地方调用,上来就直接实例化这个类。
public class Singleton {
//利用一个静态变量来保存Singleton类的唯一实例
private static Singleton instance = new Singleton();
//将构造器私有化
private Singleton() {
}
//使用这个方法来实例对象,并对外提供访问
public static synchronized Singleton getInstance() {
return instance;
}
}
还有一个方式就是,我们只需在这个对象第一次进行创建的时候进行同步,保证对象只被创建一次即可,当对象创建后,就不需要再进行同步,那么我们就可以把同步的范围进行缩小。
public class Singleton {
//利用一个静态变量来保存Singleton类的唯一实例
private volatile static Singleton instance;
//将构造器私有化
private Singleton() {
}
//使用这个方法来实例对象,并对外提供访问
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}