QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2009|回复: 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
    浅谈单例模式的实现方式
    % [% B6 L5 S7 u& _" T单例模式(来自菜鸟教程)0 m# L' _' w, O7 G1 W5 ~" w: r

    5 Z# p& e1 }: x! V6 a单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
    . }" \4 ?, {8 R/ I" {单例模式的要求
    % {! U, s- p1 c
    2 @7 o: [0 J, p- [  w. n构造方法必须私有化(确保只有自己能创建)* F2 R0 b0 E9 U2 u" m. \  L6 G
    以静态方法返回实例(外界不能通过new来获取到对象)
    + O* b9 t$ H5 m+ @( Z; j确保对象实例只有一个(只对类进行一次实例化,以后都直接获取第一次实例化的对象)
    ) Q" H+ I! [, Y4 ]- Y( `7 \单例模式的实现
    2 ~8 g/ G+ u. `& A
    ; e) d/ X4 {* ?0 c  B1 o5 K" Y1、懒汉式(线程不安全)
    ' K' {# S9 t8 k, c
    6 H. f/ B& |. g( T7 M描述:这种方式是最基本的实现方式,但是不支持多线程。因为没有加锁,在多线程不能正常工作
      Z/ ]* u' d, {; j/ v//懒汉式(线程不安全)6 u* e9 n' k9 s. E+ N
    public class Singleton {  
    : B, `6 S) g; L, W1 L2 K# j/ z    private static Singleton instance;  3 r( `  F/ B* z- O' _

    % E4 l/ j+ [9 M. I- q    private Singleton (){}  * w9 g+ E) u. |4 j

    0 V* @& b# t, A. [: i    public static Singleton getInstance() {  $ ^+ k5 q' r$ Y/ h
            if (instance == null) {  " @; S  L3 z8 V4 ^
                instance = new Singleton();  # F* F" z( X) k) i' K7 d
            }  
    ; s, @2 ~: D; K9 \! D4 F        return instance;  
      O* ]. P! A2 E1 j    }  5 K) p7 s- X, h, z2 c6 D
    }
    , g( F; b3 h8 C) y: T

    2、懒汉式(线程安全)

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

    //懒汉式(线程安全)5 ^3 J  l5 c! E  @/ \2 G2 ]1 K
    public class Singleton {  
    / p) `/ V: T  M    private static Singleton instance;  % I% H) e1 _" N; m
    4 V4 K) K# u1 v; N: G7 U
        private Singleton (){}  # j# D) e( `9 ]# Z  ^/ B3 f

    ; a1 n& `* O" U2 u- @    public static synchronized Singleton getInstance() {  
    3 H* I) M7 T/ ~. K, A2 |; k        if (instance == null) {  
    ; y0 h& E. P+ B3 o8 b            instance = new Singleton();  0 R% o- h- B7 S8 J; R
            }  
    0 O0 p$ g4 B( Y6 O( p        return instance;  0 Y( P' I  x, o  b# G
        }  : {- U7 t) B3 I
    }
    7 @3 D1 g  h) _* Z
    . y: f* v5 i6 Q6 @+ o

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

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


    ) g# C% V. U9 E  |+ c- G6 i//双重校验锁
    5 W3 C( a8 q1 Q5 Kpublic class Singleton {
    ) @9 }4 c" a$ J% d5 h    private volatile static Singleton instance;
    3 v+ H7 x6 Z  O8 \8 R3 d
      b/ x! W% U8 @* H( q$ V5 [    private Singleton() {, J: `! m. p$ e7 S2 `

    ; d' k. V+ K/ Q& }" v    }7 P/ i( ^* m" p; E! q

    % S! K- \' k( c1 E0 n' J    public static Singleton getInstance() {, |9 y' q, W7 r# e: A3 C
            if (instance == null) {
    ! i4 R( u7 m7 O( |            synchronized (Singleton.class) {
    & T* g  k* ]/ t( p2 H                if (instance == null) {: P. o8 G+ [/ ~- l
                        instance = new Singleton();' T2 s+ D6 Y7 y
                    }
    7 {* R1 g4 O% y; e5 u/ p            }4 r: S" s- p6 j9 W4 G" @. E
            }
    8 X( A% J8 B3 [* p1 Y+ \! v        return instance;  [" E3 S% X1 j, Q
        }& p* ~2 z" e6 ^% s7 X8 Q/ R; X7 [
    }
    # M# O1 S' m+ @  {- g: z- Z+ H  {
    1 E) V: Z+ k* c. d: t3 }+ s6 g0 e+ [  s) M3 z; a  E

    4、饿汉式(线程安全)

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


    & z/ d! D* J- U( P+ t" L' T$ S//饿汉式+ s- q. E( Q; @6 L
    public class Singleton {! u1 D! V. ?/ N2 H! ]
        private static Singleton instance = new Singleton();
    % b; i! Y" K) |' S* c8 ?, R
    $ e6 j! q: Z8 @& R( q2 x    private Singleton() {# A; E2 m9 y& I/ Z
    3 p& ~5 f+ s9 U. r  ~+ |
        }! A- L: x4 m% V; a
    # }5 e: ^# s' e2 c, l
        public static Singleton getInstance() {
    0 g$ \5 ^0 ~1 \5 [% A  ]% j        return instance;
    ( V& |7 b3 X$ M0 F    }5 U3 a2 ]( i8 T! @: }
    }+ V0 n0 ?5 f  A- s7 r+ U8 v

    + N  x2 {9 q& a* p* N" m' Z& Y& u; O- h0 H9 {; k

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

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

    //静态内部类
      N' [( Q9 _( m* @$ Z0 @0 v/ Mpublic class Singleton {, @0 Y: Q  {4 l( }- `
        private static class SingletonHolder {+ o/ w$ R5 ^4 B6 ^, r" X' G
            private static final Singleton INSTANCE = new Singleton();
    8 i) x' D0 T8 M) i" E3 e    }1 @- M$ q* @/ f% o& D% H" b1 T

    8 Z' O9 G& I" ?0 T, O    private Singleton() {! ~  m+ O; W. G& X( N6 B$ G7 G
    ! A. [' J9 f! N  `3 w1 P
        }
    + _! a) _/ B8 D2 ~
    & m6 |4 N- p# N$ h    public static final Singleton getInstance() {) n" J1 \9 E6 v' W
            return SingletonHolder.INSTANCE;
    " M3 }0 K* Q$ F$ f    }6 I# I" M  {  Z5 @
    }
    * `) q1 W! R4 [- q7 g9 h3 s, M& k5 d6 J& }. ]/ G) O6 \

    6、枚举(线程安全)

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

    6 l! i% U; {7 P6 ?7 U' {: j0 E9 S
    //枚举8 r! H, ?1 C- L4 C& c( [9 {
    public enum Singleton {) @* h8 B9 r- u! S0 V8 ]% z0 U
        INSTANCE;, C' `2 [; |: ]6 w9 o. H  w
    # F- A% E* e8 a2 L2 B9 Q
        public void whateverMethod() {; m# E+ F" k1 F
    * F% t1 M0 e; X- l4 a* m+ L3 \
        }
    . h! [  P  W: M8 n1 N}, I  }( ]- v% u/ D! N, y, `
    9 O. X9 P' H3 R$ i
    9 w9 C8 ]3 }; ]9 q* K$ B
    总结
    3 f9 y# H! r& L! x1 d0 W6 ^% Y8 }( W0 a$ x
    一般情况下,不建议使用第1种和第2种懒汉方式,建议使用第4种饿汉方式。只有在明确实现lazy loading时,才会使用第5种静态内部类方式。如果涉及到反序列化创建对象时,可以使用第6种枚举方式。如果有其他需求,可以考虑使用第3种双重校验锁方式。/ R0 R- o$ D; U$ c) Z
    PS:开始面临着春招,好多面经都有说到设计模式。最常见的面试题就是讲一讲单例模式的实现和理解,所以我写一下,加深我对单例模式的理解和印象。觉得对你有帮助的话可以点点赞,谢谢啦~~~
    $ q( ~; A) R* @% U3 P. q- |————————————————. |8 t  X! H+ H- C
    7 a& j! j( x9 o" N8 Y4 s; |' R
    $ G1 Z) t: X4 [7 D4 k
    9 _1 M+ u( g. X2 R

    & @, C7 X- H- \3 g* j& n* R3 Q% n) Y8 `

    " I5 I* ~6 X1 l& o. q" W" O3 ]# R" g  Q( f) e

    ! W4 e/ A2 x, H* \2 [5 B/ o6 [9 |0 h! i  K7 F7 H" D6 {5 @
    原文链接:https://blog.csdn.net/weixin_37686415/article/details/105164764( Y8 A/ W: r' ]8 R! p0 }; F

    ( Q: }% ~, ]- V4 W2 }1 J4 A1 q8 s5 Q  `( y0 Q# C# h
    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-7-31 06:28 , Processed in 0.366728 second(s), 61 queries .

    回顶部