//饿汉模式
public final class Singleton {
private static Singleton instance=new Singleton();//自行创建实例
private Singleton(){}//构造函数
public static Singleton getInstance(){//通过该方法向整个系统提供实例
return instance;
}
}
饿汉模式
我们可以发现,在上面代码中,使用了static 修饰了成员变量instance,在类初始化阶段中static 修饰了成员变量instance,在多线程的情况下能保证只实例化一次。
这种方式实现的单例模式,在类初始化阶段就已经在堆内存中分配了一块,用于存放实例化对象,所以也称为饿汉模式。
然而饿汉模式在类成员变量比较多,或变量比较大的情况下,可能会在没有使用类对象的情况下,一直占用堆内存。试想下,如果一个开源框架中的所有类都是基于饿汉模式实现的单例,这将会初始化所有单例类。将会占据堆中很大一部分空间,对系统性能来说无疑是灾难性的。
懒汉模式
//懒汉模式
public final class Singleton {
private static Singleton instance= null;//不实例化
private Singleton(){}//构造函数
public static Singleton getInstance(){//通过该函数向整个系统提供实例
if(null == instance){//当instance为null时,则实例化对象,否则直接返回对象
instance = new Singleton();//实例化对象
}
return instance;//返回已存在的对象
}
}
以上代码在单线程下运行是没有问题的,但要在多线程下,就会出现实例化多个类对象的情况。原因如下:
两个线程A和B同时运行这个getinstance方法,当线程A进入到if 判断条件后,开始实例化对象,此时instance 依然为null;同时有线程B进入到if判断条件中,之后也会通过条件判断,进入到方法里面创建一个实例对象。
这里我们使用synchronized同步锁来修饰getinstance方法:
//懒汉模式 + synchronized同步锁
public final class Singleton {
private static Singleton instance= null;//不实例化
private Singleton(){}//构造函数
public static synchronized Singleton getInstance(){//加同步锁,通过该函数向整个系统提供实例
if(null == instance){//当instance为null时,则实例化对象,否则直接返回对象
instance = new Singleton();//实例化对象
}
return instance;//返回已存在的对象
}
}
通过内部类实现
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-AArLBRqq-1710852198950)]