请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 157|回复: 1

浅谈单例模式的实现方式

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

2226

主题

43

听众

7万

积分

  • TA的每日心情

    2020-5-15 14:23
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    发表于 2020-3-30 17:20 |显示全部楼层
    |招呼Ta 关注Ta
    浅谈单例模式的实现方式. c' @% b* D7 r
    单例模式(来自菜鸟教程)
    ; ^% @- f; t" p# x, W
    ; z/ X$ {( J: C* L# V/ p" Y单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
    - w) ^" ^9 b: G0 g9 R单例模式的要求- R, v& z4 p  f# a+ U

    6 K" J# C2 h0 `3 {; P8 D2 x构造方法必须私有化(确保只有自己能创建): O4 g5 F/ u4 B/ G8 D4 ?2 W8 ]1 E+ `
    以静态方法返回实例(外界不能通过new来获取到对象)6 i% J. B5 R, h% X) |$ [  v, G
    确保对象实例只有一个(只对类进行一次实例化,以后都直接获取第一次实例化的对象)
    , f5 e! U/ @- P# b单例模式的实现# w: D2 ^- z3 _
    * A3 t4 i* O# z
    1、懒汉式(线程不安全)
    ) {% ~$ o. G: h
    9 j1 L) ~- O2 p% |9 k5 K6 }$ X' k描述:这种方式是最基本的实现方式,但是不支持多线程。因为没有加锁,在多线程不能正常工作
    ; h, q4 N3 h  U7 S- ?  ~8 x//懒汉式(线程不安全)* l: B  X- H1 q$ }6 v
    public class Singleton {  : o0 `: U* U. v; g. Y; {" U
        private static Singleton instance;  2 M* I$ Y4 l+ X- I3 |" h! W( X
    6 X2 M: g  u5 Q
        private Singleton (){}  * \9 t1 S9 z$ o( B4 e

    9 M0 c5 |! K1 m! L- H% p3 |8 z    public static Singleton getInstance() {  ) J/ @9 m: L7 r
            if (instance == null) {  : d. x% Q" E3 e/ l" U/ }5 a9 ?  ]
                instance = new Singleton();  
    1 z! \8 ^# e% n        }  2 h% \/ m* A; }4 c. O0 t
            return instance;  . e0 {, y5 N) g# v: ~9 ~8 J
        }  
    & b. o, P  J. a}9 G" h% \" ]) Z! L

    2、懒汉式(线程安全)

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

    //懒汉式(线程安全). z/ _( J& V/ m2 f
    public class Singleton {  
    ; Q0 h: b# L& V    private static Singleton instance;  1 K: d* Y5 {1 v# }. p2 g- b( {3 G
    " ?% z' ~- g4 v0 U2 @1 V
        private Singleton (){}  " w" O; s4 X& t% l( @. `

    , A( F3 L6 ?: j. j0 r    public static synchronized Singleton getInstance() {  1 q8 [5 a# y# R# J, \' J5 O* p
            if (instance == null) {  
    ' Y! s& d2 u' m4 a6 O+ X6 R            instance = new Singleton();  
    $ ^  K# B9 P- M2 j5 W3 A/ n5 t        }  7 @+ O; N" n7 T- W  W# j
            return instance;  / s4 g- O7 w, H4 \
        }  ; z& k! `, Y4 ~) A+ G# z$ S
    }+ A6 c: t; ~, X' V5 R( J9 x
    . o1 M* S4 K/ S- N" K/ k, B% Z

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

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

    5 d$ B4 J1 d5 \! D9 b4 q
    //双重校验锁( f2 ]( Y. p5 _+ i* q, y1 |" f
    public class Singleton {1 G! ~6 g0 U, j! K6 d
        private volatile static Singleton instance;
    : K( t, d) V7 Q" ]( O1 e% Z( w; U5 e9 v+ b7 J
        private Singleton() {+ W$ S* A" c' t; E
    * W% h/ U9 R8 `3 J% }6 q  \
        }
    . \+ t5 t3 Y3 |; j& _/ ^" h  `4 B7 w3 ]" X2 I/ X$ m+ h
        public static Singleton getInstance() {
    : F9 ~4 P, W" ~9 c1 k& q$ o: S9 D        if (instance == null) {8 i4 M% z. r3 o. y3 E; L, Q* [# S
                synchronized (Singleton.class) {
    : \; H' {: ~' _- S                if (instance == null) {
    ) g. [( z  H3 r  L2 W4 J% t) i                    instance = new Singleton();
    " x, Z, F( X' W3 d                }) K+ M* h3 ]- I7 E7 W7 B9 U
                }7 i. O( F/ H  \# Y
            }6 t5 O  x: {4 d, }+ [" A
            return instance;4 t- ]$ k0 x/ y0 e5 g
        }0 C% c: l6 \& n( T4 M
    }/ k, e; H& `$ m( Z# O) M

    & m. p7 S- {+ r+ Q: S6 j) f. ?- V+ E" l

    4、饿汉式(线程安全)

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

    # c3 O1 f. s! t' V
    //饿汉式
    6 I# [- Y: g1 K4 |. X4 F& zpublic class Singleton {) a9 j0 P- ?- b  ?3 U
        private static Singleton instance = new Singleton();7 U3 |0 [* g( p4 g2 y" Y) v( E

    , s( Q1 S8 `7 O7 Q+ @' ^    private Singleton() {
      E# s& D( `- ?3 t; ^9 |
    ) \3 [) L/ M8 \$ Y6 W: @& f    }" g1 w# P7 y; @3 A9 V5 G) ?4 z+ g! N

    9 _: f& q* q( }* @" e& e+ Z, j, v* q    public static Singleton getInstance() {
    ) T# M* I0 l1 Z* t$ j5 [        return instance;
    ; B0 m) N+ {% G    }
    8 s; L* X2 F$ f% n+ t6 m# S}7 O8 a* `* W# K7 H% j8 D$ m9 y& X" k
    " ?0 ~! r9 |6 n: ?

    - e9 |9 B7 t) ^1 E& z

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

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

    //静态内部类
    0 t. _. p6 I: ]$ y7 ^' o2 lpublic class Singleton {
    0 m4 D. Y& C( F( q2 |$ o    private static class SingletonHolder {8 y# I- q+ ]) R* ^6 }9 g" z8 K3 @
            private static final Singleton INSTANCE = new Singleton();
    3 d  V! E0 R! P( l' E% l    }0 g4 j) d+ c% s9 b: k; i8 g

    - D; B1 B+ n: Y+ t9 y    private Singleton() {
    " R) {' w" Y7 N- K( `% Z0 k! [$ R
    ; ~9 U; Z# @& p1 [& C    }
    1 `% c+ u+ ]3 Q1 _$ N( f
    # _  N9 Y: B6 G- u) l    public static final Singleton getInstance() {" i( G2 O  @% O% ~# Z5 y
            return SingletonHolder.INSTANCE;9 q/ D" G; j: W5 }" Z/ }7 O: r
        }
    : @9 o- N3 L& S! i/ ]3 W6 E}+ O$ k- L; H: W# e7 F9 l9 ^
    ! ^1 S2 d8 X- ?* s9 s: e8 v

    6、枚举(线程安全)

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


    ( R) M/ q& }3 W: Y# \8 O//枚举, |& T" ^, s  [( C$ u
    public enum Singleton {
    % B6 x2 Q4 [: i1 [* M1 s$ }+ ]    INSTANCE;7 E: W+ o5 T( }- F
    9 t' }. H- Y9 f
        public void whateverMethod() {
    8 L- Y$ C9 L; m7 R
    ! a: C  S# P* v$ l" i    }
    ) D. a( w$ z0 `}
    0 ^8 k8 u/ _$ f, {1 U0 Z
    $ ?  l% `8 w  J- \2 N0 y4 T, m! k- l* s& n4 O( @. ~- m$ E0 k
    总结" s- y# N+ ^5 S, [+ U% D; {3 E

    , ?2 R. ~4 J0 ]一般情况下,不建议使用第1种和第2种懒汉方式,建议使用第4种饿汉方式。只有在明确实现lazy loading时,才会使用第5种静态内部类方式。如果涉及到反序列化创建对象时,可以使用第6种枚举方式。如果有其他需求,可以考虑使用第3种双重校验锁方式。6 |, V" q. R; k( Y% `# C4 }1 [
    PS:开始面临着春招,好多面经都有说到设计模式。最常见的面试题就是讲一讲单例模式的实现和理解,所以我写一下,加深我对单例模式的理解和印象。觉得对你有帮助的话可以点点赞,谢谢啦~~~
    ; j6 e* i$ O- i0 ]. ]+ G————————————————) H( N0 j: i2 |; n
    ( |6 w3 U- R3 Z, L" w
    ) D8 m9 e. j( V0 w8 i6 q9 s

    ' n* S. B1 L- q$ a  `' O, j
    ) s; o* L' Q4 ]$ U6 j# I" y6 h% A& E
    ' H2 R. p7 O9 Y/ V+ P, R+ t1 ~+ e4 ^' ]# P6 V
    " T+ H: m- Y* s; L. @

    * z& e/ s" M+ s, B2 W4 G) f
    6 z5 T4 l: ~8 h) h原文链接:https://blog.csdn.net/weixin_37686415/article/details/105164764/ X: o! ~( f, f

    $ [- F- b. j1 `% h, {8 _6 ~! C: V( |3 R7 m2 s( S% l+ d& d! M0 r5 j
    zan

    0

    主题

    0

    听众

    1

    积分

    升级  20%

    该用户从未签到

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2020-6-1 07:35 , Processed in 0.785410 second(s), 56 queries .

    回顶部