单例模式:
核心概念:确保一个类在JVM虚拟机内存中只有一个对象实例存在;
单例模式有什么好处:
在业务开发中,某些类创建是非常频繁的,如果该类可以创建多个实例,这样就造成了资源浪费,对于一些大型的类对象,在内存中是一笔比较大的开销,使用单例模式则省去了new操作,降低系统内存的使用频率,减轻GC(垃圾回收)的压力,使用单例可以避免对资源的重复占用;
如何实现单例
1.构造方法必须私有化,这样做可以使外部类无法通过构造器创造该实例,可以更好管理类的实例创建;
2.提供全局唯一的一个对象,做私有化处理不让外界之间调用;
3.提供公共的全局方法供外界获取,返回对象实例
4.没有公开的的set方法供外部创建该对象实例
饿汉式
使用场景
如果在应用中一块数据经常被访问就可以使用饿汉式;
具体代码如下:
public class TestDesign {
public static void main(String[] args) {
MyDesign myDesign=MyDesign.getMyDesign();
MyDesign myDesign2=MyDesign.getMyDesign();
System.out.println(myDesign==myDesign2);//true
}
}
class MyDesign{
//1.构造方法私有化,防止外部调用构造方法创建对象
private MyDesign(){
}
//2.定义全局唯一的一个对象,做私有化处理不让外界之间调用;
private static MyDesign myDesign=new MyDesign();
//3.提供公共的全局方法供外界获取,返回对象实例,
public static MyDesign getMyDesign(){
return myDesign;
}
}
结论:饿汉式如同他的名字一样,直接上来就直接初始化当前类的实例;
懒汉式:
懒汉式与饿汉式最大的区别就是:在需要用的时候再实例一个对象,不直接去创建实例化对象,而是在需要的时候再去创建实例对象;
第二个区别:懒汉式线程不安全
public class TestDesign2 {
public static void main(String[] args) {
MyDesign2 myDesign2=MyDesign2.getMyDesign();
System.out.println(myDesign2);
}
}
class MyDesign2{
//1.构造方法私有化,防止使用构造方法实例化
private MyDesign2(){}
//2.定义静态私有引用类型变量,私有化防止外界直接调用
private static MyDesign2 myDesign;
/*
* 这里会有线程安全问题
*3.提供公共的静态的全局方法供调用
* */
public static MyDesign2 getMyDesign() {
if (myDesign==null){
myDesign= new MyDesign2();
}
return myDesign;
}
}
线程安全问题:
解决方案1:加锁 双重检测(synchronized),弊端:这种方式会降低系统的处理速度以及在Java中存在反射类,可以直接无视私有的构造方法去直接new对象。
推荐方案:使用枚举类型