单例模式:(饱汉(懒汉),饿汉)
1.单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。
2.特点:
2.1:一个类只有一个实例
2.2:自己创建这个类
2.3:整个系统只能用这个实例
3.实现方法:
3.1:饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)
public class Singleton1 {
private Singleton1() {
}
public static Singleton1 instance = new Singleton1();
public Singleton1 getInstance() {
return instance;
}
}
优点:1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快
缺点:资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),
那么这个实例仍然初始化
3.2:懒汉式(饱汉式):单例实例在第一次被使用时构建,延迟初始化。
class Singleton2 {
private Singleton2() {
}
public static Singleton2 instance = null;
public static Singleton2 getInstance() {
if (instance == null) {
//多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况
instance = new Singleton2();
}
return instance;
}
}
注意: 懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,
虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。
改进方式就是加锁synchornized
class Singleton3 {
private Singleton3() {
}
public static Singleton3 instance = null;
public static synchronized Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
优点:资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
缺点:第一次加载时不够快,多线程使用不必要的同步开销大