单例模式
单例模式的介绍
是Java中最简单的设计模式之一,属于创建型模式,提供了创建对象的最佳方式,,这个模式呢,按照我的理解就是,一个类,自己负责创建自己的对象,并且还要确保只能有一个对象被创建,这个类提供一种访问其唯一的对象方式,,
注:
1、单例类只能有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须对其他所有对象提供这一实例
上代码
public class Boos {
private Boos() {
//私有化构造方法/确保只有自己能创建对象
System.out.println("一个Boss对象被实例化");
}
//存储实例对象
private static Boos Instance = null;
//对外提供获取实例的方法
public static Boos getBoos() {
//确保实例唯一
if (Instance == null) {
Instance = new Boos();
}
return Instance;
}
}
单例模式,主要是用来解决,一个全局使用的类频繁创建与销毁,比如我们的jdbc操作、io操作时,,
单例模式的好处与坏处:
1、在内存里只有一个实例,减少内存的开销,尤其是频繁的创建和销毁对象,
2、避免了对资源的多重占用,(例如文件读写)
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
单例模式有好几种实现方式,结合昨天的多线程,提到线程,上面的代码,是最简单的模式,在多线程中,他并不是真正的单例,也就是说,普通的单例模式,在多线程中不安全
升级模式1、懒汉式,线程安全
是否 Lazy 初始化:是
是否多线程安全:是
描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
getBoos() 的性能对应用程序不是很关键(该方法使用不太频繁)。
public class Boos {
private Boos() {
//私有化构造方法/确保只有自己能创建对象
System.out.println("一个Boss对象被实例化");
}
//存储实例对象
private static Boos boos = null;
//对外提供获取实例的方法
//使用synchronized修饰,确保多线程安全
public static synchronized Boos getBoos() {
//确保实例唯一
if (Instance == null) {
Instance = new Boos();
}
return Instance;
}
}
升级模式2 饿汉式
是否 Lazy 初始化:否
是否多线程安全:是
描述:这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
public class Boos {
private static Boos instance = new Boos();
private Boos (){
System.out.println("一个Boss对象被实例化");
}
public static Singleton getBoos() {
return instance;
}
}
推荐使用 第二中升级模式哦
浙公网安备 33010602011771号