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

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

  •  1
     
  •   kerb15 · 2018-07-09 20:13:38 +08:00 · 3479 次点击
    这是一个创建于 2365 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    咋现在叫懒汉和饿汉了, 感觉好没文化...
    kerb15
        19
    kerb15  
    OP
       2018-07-10 13:15:57 +08:00 via Android
    @luoyou1014 哈,我第一次接触都是这么叫的
    reus
        20
    reus  
       2018-07-10 15:14:41 +08:00
    @luoyou1014 是哪个培训班老师起的名字吧,难听
    zjl11
        21
    zjl11  
       2018-07-20 15:08:05 +08:00   ❤️ 1
    推荐使用 enum 做单利
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1442 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:58 · PVG 00:58 · LAX 08:58 · JFK 11:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.