QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1967|回复: 1
打印 上一主题 下一主题

浅谈单例模式的实现方式

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-3-30 17:20 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    浅谈单例模式的实现方式
    ( D. f- y& |# r单例模式(来自菜鸟教程)
    % F, `: j) [0 B" ~
    1 S6 v8 \( ^  ?8 ]+ |单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
    2 M0 `, c  ]$ f7 T( y6 P* J5 H单例模式的要求  s, h9 |3 D$ m* V1 N: c
    ! S/ `8 I1 S& E6 w$ g
    构造方法必须私有化(确保只有自己能创建)
    ( T9 t, a0 K4 @0 g: x% O以静态方法返回实例(外界不能通过new来获取到对象)
    6 f8 {7 ]9 a/ A7 W1 g确保对象实例只有一个(只对类进行一次实例化,以后都直接获取第一次实例化的对象)9 W/ i- M$ `, P3 b# p+ }
    单例模式的实现
    $ `' y2 s2 r+ U! a
    6 c1 S) \+ [& g  t7 ?, z1、懒汉式(线程不安全)* D. C( n* S( z* U! n6 m" l
    2 t  v0 x) Y2 K$ l, h0 [4 f- f
    描述:这种方式是最基本的实现方式,但是不支持多线程。因为没有加锁,在多线程不能正常工作. @# k* P5 R- D5 o% ?: {
    //懒汉式(线程不安全)
    * ]4 b* {' p9 c3 L0 ^0 U5 Epublic class Singleton {  
    ' F6 a: g4 S  N- v) F  u9 A    private static Singleton instance;  7 \- A# Z4 q5 C- `- c7 k

    9 C' U5 H' k. g* X& i! ^    private Singleton (){}  4 w3 Z+ M  R# b. X2 ^

    ) H% Y1 {; X0 D3 t0 d    public static Singleton getInstance() {  0 J, c- W( ]! M9 s, v( J3 g
            if (instance == null) {  
    0 w& S) C, n7 g" h# Q+ |( G            instance = new Singleton();  
    / s% y0 D; G+ O& j- z+ c& e: m        }  1 x5 W8 k6 ]1 d0 L
            return instance;  
    , e# ~. n8 m' n& P5 b4 a    }  
    1 Q2 k+ r/ B5 c% {  f" _: U}$ i/ o  \6 G" D3 j' r( o/ f

    2、懒汉式(线程安全)

    描述:能够在多线程下正常工作,但是,效率极低

    //懒汉式(线程安全)& V* ]1 M: N) M! P+ I/ D7 e
    public class Singleton {  
    7 O& h1 i( h1 V; `    private static Singleton instance;  . X2 g* S1 q; N
    4 W1 F, `8 D: }0 Q! k& m
        private Singleton (){}  6 S: r. Y( [+ @( I! [

    % g* ~/ d! B) r, u. R" O9 W    public static synchronized Singleton getInstance() {  
    . h8 n' n  }5 S8 B: E1 F6 n, N        if (instance == null) {  * v  `( T: u) @$ y" {: M* X
                instance = new Singleton();  
    6 n: `/ [# x# q        }  
    ; n3 s9 I/ A. e2 Q' H        return instance;  / R5 `5 r  }$ c5 ^. l
        }  
    " [8 A/ Q; J- z' c- o; _}
    7 l/ o5 V# K3 T" @  {
    ) D/ d6 ?0 K& v0 M1 T8 p9 o2 H0 b

    3、双重校验锁(DCL,即double-checked locking)(线程安全)

    描述:对懒汉式(线程安全)的优化,采用双锁的机制,安全且在多线程情况下能保持高性能

    * |. F+ I+ z2 M7 }8 G
    //双重校验锁8 [7 i; Q* W$ |
    public class Singleton {: b' @5 ?* _  c2 s
        private volatile static Singleton instance;
    7 Y- @; H6 ]. G& ]2 X7 M! i, }) s- c+ `: T$ \- T. X3 H0 F( S- F  C
        private Singleton() {
    4 G& _) {$ B' {5 X2 L# {( i: M1 E/ p+ C' S$ ?. u# B8 s( A
        }
    . X# z, A  ^3 l" O
    1 ^& K. M( j) B1 ]    public static Singleton getInstance() {4 g  d4 O. i9 N
            if (instance == null) {3 `! ~0 k7 k* Q+ e4 v
                synchronized (Singleton.class) {! g# M% P; o& X
                    if (instance == null) {
    . d9 v; r( x& [  o% j% k                    instance = new Singleton();5 Y( \5 G. W0 E7 b
                    }& v  p0 P6 s& L) N
                }
    . v, [6 t0 x9 h+ i& h$ n% m4 o        }8 I1 O8 ~9 J0 W/ B: E3 u
            return instance;/ n, \0 p* `& m7 B
        }6 `# R% s+ ^$ s# V0 y
    }
    : K3 c6 R4 ^7 o. b  Y- Q* j0 o. d# C

      o5 e  Y' O8 P2 A6 Z

    4、饿汉式(线程安全)

    描述:这种方式比较常用,但容易产生垃圾对象


    4 N; G, M' h& J/ X1 \4 R# y. J5 @//饿汉式
    ' B6 [! @) f6 l2 rpublic class Singleton {1 m- l( E5 E2 v) @& v
        private static Singleton instance = new Singleton();
    + R; B+ u( O& `$ w2 e; n. M/ m2 o" W+ i- O$ _1 C* l: \/ f
        private Singleton() {* S' e4 U6 p" ]! B9 u

    ) `. c( E7 w: z5 _' I5 e: S& s- ~' g    }
    7 D! I4 V. Y& e0 h0 t( Y3 t" Q% \; i  G; T$ \, f
        public static Singleton getInstance() {6 L) ?/ S; F2 l" V: X9 c4 M/ ^
            return instance;# ~1 ]) O! K3 n( N4 }+ K! i
        }: C& ]3 ?+ p1 C, r5 H: ~; Q
    }1 M7 \8 V/ m+ h  v! u+ W/ ^. v3 j

    1 j9 o: R0 y* C5 B  H( W& `4 X: P# b% v' p) [* M

    5、静态内部类(线程安全)

    描述:这种方式达到跟双重校验锁一样的效果,这种方式只适用于静态域的情况,双重校验锁可在实例域需要延迟初始化时使用

    //静态内部类
    , M9 o' ]; s( n9 v' hpublic class Singleton {+ e1 q' J  [! |. O8 m! B1 k
        private static class SingletonHolder {: z5 N# V3 k  l) W3 o
            private static final Singleton INSTANCE = new Singleton();+ q3 C$ L3 A& d( h! n" I. D
        }  a. G* U' P' V* H; i

    4 G4 S: X% d( b2 U; m$ [    private Singleton() {  p7 O: o) T( }% y6 \

    " n% [) Z& \6 \9 Q$ O  k, E% g2 f    }* n# c$ L5 D' Z: m3 A
    ( f* [1 D( _6 A' `$ N) p7 H
        public static final Singleton getInstance() {
    3 r& [) I$ m3 I! r        return SingletonHolder.INSTANCE;
    8 d$ r; u, \/ r    }
    7 x3 M0 y( }+ E; B' U! j}% f  q# D  @4 y6 x, |( \

    + m' [0 j: q  S+ ]) T5 D: _

    6、枚举(线程安全)

    描述:这种方式还没有被广泛采用,但是这种实现是单例模式的最佳方法。更简洁、自动支持序列化机制、绝对防止多次实例化


    8 H( P" [1 T; r# h0 e  s$ q6 e//枚举% O1 _* {/ L) b0 F; v
    public enum Singleton {" ]2 \" H6 z4 @/ M% r$ y% s
        INSTANCE;. R  I" Z5 V/ z1 q5 X0 P

    % V7 s. |6 l  N! p    public void whateverMethod() {1 N- g' a$ ~4 R2 S. g7 N
    1 Q. ^" Q5 p3 P# S8 l5 z: I
        }6 H) t7 f$ Z5 B8 E: S$ G) }3 ^
    }5 H0 p+ ~9 V7 N  ^1 S8 L. k

    , }9 l8 {" T' Q, s
    / H' ~. ?8 |4 `5 R4 X/ [% p总结
    8 J1 l2 g, x" |8 f+ E0 l  a7 `! q) T: A. t
    一般情况下,不建议使用第1种和第2种懒汉方式,建议使用第4种饿汉方式。只有在明确实现lazy loading时,才会使用第5种静态内部类方式。如果涉及到反序列化创建对象时,可以使用第6种枚举方式。如果有其他需求,可以考虑使用第3种双重校验锁方式。" v, B6 }- w6 I# s' T
    PS:开始面临着春招,好多面经都有说到设计模式。最常见的面试题就是讲一讲单例模式的实现和理解,所以我写一下,加深我对单例模式的理解和印象。觉得对你有帮助的话可以点点赞,谢谢啦~~~/ k5 u( w' }# t1 q7 k" N' ^/ ]
    ————————————————
    8 _; Y6 S/ N* S: i. @! R  k* w' W( t" Y. K
    % _8 c" _4 F) X1 N# B& H

    + I4 F+ j. @4 N( v
    7 ~$ T3 R- Q$ _) f+ X
    ( _4 }0 F. f8 t$ w( i4 J+ X
    - C  B4 S* K" @, ~
    3 d3 Y6 Q5 Y) `% R0 b2 b) d1 H/ t5 Q: s6 F2 l! ?& U8 Y  r

    $ \3 W& ~% f4 @9 l* ?原文链接:https://blog.csdn.net/weixin_37686415/article/details/1051647640 T' N! {8 g/ T, Z: e7 j0 ]
    # _0 v* x# a) {. V' l! T

    1 C" [( w; i; u1 C, F( ^8 Q
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    0

    听众

    1

    积分

    升级  20%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-10 02:02 , Processed in 0.466426 second(s), 61 queries .

    回顶部