100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 单例模式(饿汉单例模式and懒汉单例模式)

单例模式(饿汉单例模式and懒汉单例模式)

时间:2019-11-06 04:18:36

相关推荐

单例模式(饿汉单例模式and懒汉单例模式)

文章目录

单例模式单例模式是什么? 饿汉单例模式饿汉单例是什么?实现步骤代码实现 懒汉单例模式饿汉单例是什么?实现步骤代码实现懒汉单例线程安全问题解决方案 总结

单例模式

单例模式是什么?

保证系统中应用该模式的类只有一个实例,即该类只能创建一个对象。

饿汉单例模式

饿汉单例是什么?

在用类创建对象时,对象已经提前创建好

优点:适用于单例对象较少的情况

缺点:所有对象类加载的时候就实例化,如果有很多单例对象存在,初始化时就会导致大量的内存浪费

实现步骤

定义一个类,把构造器私有定义静态变量储存对象

代码实现

(通过HungryManModel访问该类的instance对象)

package hk;/*** 饿汉单例模式*/public class HungryManModel {/*** public 对方可以访问* 对象只能是一个,所以用static静态成员变量*/public static HungryManModel instance=new HungryManModel();/***私有化构造器,不是私有的化,可以创建多个对象*一定要写出来并定义为private,因为有默认的*/private HungryManModel(){}}

Test类

package hk;public class Test {public static void main(String[] args) {//调用静态变量, 类名.变量名HungryManModel h1=HungryManModel.instance;HungryManModel h2=HungryManModel.instance;System.out.println(h1);System.out.println(h2);}}

输出结果

由结果可知h1和h2为同一对象

懒汉单例模式

饿汉单例是什么?

在需要对象的时候才去创建对象

实现步骤

定义类,私有化构造器定义一个静态变量存储一个对象提供返回对象的方法

代码实现

package hk;public class LazyMode {/*2. 不能new,否则就变成了饿汉模式最好别定义为public,对方如果第一次调用为LazyMode h2=LazyMode.instance; 就会变为null*/private static LazyMode instance;//1.private LazyMode(){}//提供方法,对外返回一个单例对象public static LazyMode getInstance(){/*3. 不能直接这样写,否则每调一次这个方法,就会产生一个新对象instance=new LazyMode();return instance;*/if (instance == null){instance=new LazyMode();}return instance;}}

Test类:

package hk;public class Test {public static void main(String[] args) {LazyMode h1=LazyMode.getInstance();LazyMode h2=LazyMode.getInstance();System.out.println(h1);System.out.println(h2);}}

输出结果:

由结果可知h1和h2为同一对象

懒汉单例线程安全问题

懒汉单例模式是线程不安全,当调用方法时,首先要经过if判断,在多线程场景下,就可能存在多个线程同时进入if判断,此时对象还未创建,那么就会多个线程都去创建对象,这样单例模式就被破坏了。

解决方案

具体可查看这篇文章

懒汉单例模式解决线程安全问题

总结

从内存角度看,懒汉模式要比饿汉好一些,当调用这个类的其它功能,不需要这个对象时,懒汉模式就不必提前创建对象,节省内存。饿汉模式即使不需要对象,但此时也会创建对象(与类一起加载)。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。