首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

饿汉式单例真的会比较占用资源吗

  •  1
     
  •   kerb15 · 73 天前 · 1856 次点击
    这是一个创建于 73 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经常看到网上说懒汉式可以做到延时加载,而饿汉式在类加载的时候就会实例化。

    但是我们平常在用单例的时候,基本上都是直接 Single.getInstance()的方式去获取实例,懒汉式在我们第一次调用这个方法的时候会实例化,那么饿汉式呢?

    饿汉式的单例类是在我们启动虚拟机的时候就加载了,还是在我们第一次调用 Single.getInstance()的时候加载呢?

    21 回复  |  直到 2018-07-20 15:08:05 +08:00
        1
    HypoChen   73 天前
    看你有多少个饿汉了
        2
    twogoods   73 天前
    恶汉一开始就加载了 getInstance 只是返回那个已创建的实例而已。既然实例最终都是要用到的,内存终究是要占的,懒汉式代码写起来还复杂,有必要吗?
        3
    lihongming   73 天前 via Android
    学学静态内部类吧,完美
        4
    zjp   73 天前 via Android   ♥ 1
    网上的文章错了,就这么简单。
    一个类只有到被调用(静态方法,静态属性,new(),子类初始化,main 方法还有反射)才会被加载。除了单例中还有其他静态方法被先调用的情况,懒汉饿汉的初始化时机一样。

    推荐《深入理解 Java 虚拟机》三手资料简直有毒
        5
    zjp   73 天前 via Android
    @zjp 还有双重检查锁简直是流毒…搞得那么复杂还不一定写对…
        6
    lhx2008   73 天前 via Android
    @zjp 双重检查没毛病啊,如果获取单例时间太长不检查在多线程就出问题
    两种单例,一种问题就在他调用别的静态方法的话,可能会意外加载
        7
    sagaxu   73 天前 via Android
    @zjp 双检测在 java 1.5 之后是很容易写对的
        8
    abcbuzhiming   73 天前
    我一直不明白这个时代用懒加载还有意义吗?无非就是第一次启动快一点罢了
        9
    zjp   73 天前 via Android
    @lhx2008
    @sagaxu
    主要是有简单的方法不用,去弄得那么复杂。而且在现在有偏向锁和各种锁优化的情况去看双重检查就觉得有点过度优化了
    我一开始写就漏了 volatile 修饰
        10
    cyspy   73 天前 via Android
    如果你有一千个需要单例的对象,其中几百个可能很久都用不到,显然应该用懒加载。但大多数情况下只需要几个单例而且必须用到,显然没区别。
        11
    springGun   73 天前
    饿汉式 classLoader 第一次加载.class 创建吗?
        12
    lihongjie0209   73 天前
    先用最简单的饿汉, 如果真的发现内存不够用了, 再优化嘛
        13
    zhouquan03   73 天前
    推荐静态内部类方式,简单易懂。
        14
    kerb15   73 天前
    @lihongming @zhouquan03 目前开发中确实是用静态内部类的方式去实现单例的
        15
    kerb15   73 天前
    @zjp 周志明那本书吗
        16
    crayygy   73 天前 via iPhone
    Effective Java 推荐使用静态内部类,综合来看的话,这种的确是最简洁也最方便的写法
        17
    zjp   73 天前 via Android
    @kerb15
        18
    luoyou1014   73 天前
    没有吐槽这个名词吗, 我记得我学习的时候都是用的贪婪加载, 懒加载, 或者叫即时加载和延时加载.

    咋现在叫懒汉和饿汉了, 感觉好没文化...
        19
    kerb15   73 天前 via Android
    @luoyou1014 哈,我第一次接触都是这么叫的
        20
    reus   73 天前
    @luoyou1014 是哪个培训班老师起的名字吧,难听
        21
    zjl11   63 天前   ♥ 1
    推荐使用 enum 做单利
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1931 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 22ms · UTC 11:38 · PVG 19:38 · LAX 04:38 · JFK 07:38
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1