QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1938|回复: 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
    浅谈单例模式的实现方式
    " V1 \, d8 z1 }0 {6 c单例模式(来自菜鸟教程)6 Z1 |+ `. q5 ~6 p
    " W9 @, b. k" r; U; i6 m0 e
    单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。7 R3 ^/ i1 W! j# b
    单例模式的要求
    - Q' u( h) {; x$ N$ r! I; \6 L' P- G; }4 t* J0 z8 r
    构造方法必须私有化(确保只有自己能创建)
      n! x' I9 M& C: s  f7 _/ P/ t以静态方法返回实例(外界不能通过new来获取到对象). q+ a5 H* i' Y$ k5 E. g
    确保对象实例只有一个(只对类进行一次实例化,以后都直接获取第一次实例化的对象)8 z1 T5 X& g" [' A& O- C# A
    单例模式的实现
    4 I- E0 z3 L0 ]& Y( F  x& @2 d/ i( B( D- y! x& h( @( R2 v
    1、懒汉式(线程不安全)) Q" _& v2 p7 z/ u

    - p- u+ C" g2 m+ R0 j( F描述:这种方式是最基本的实现方式,但是不支持多线程。因为没有加锁,在多线程不能正常工作
    6 }) I1 i) n4 u, ^//懒汉式(线程不安全)
    , \, n% q/ G! |- x* g: ypublic class Singleton {  
    - J/ h6 [" V2 H    private static Singleton instance;  " l: T# r' ?5 E
    * B/ b; }- \( _4 D9 b. J$ h
        private Singleton (){}  
    : _# X, {& M  D
    % E' j: o) F( d3 P5 G) N/ I5 q    public static Singleton getInstance() {  * n9 i( }2 q2 g2 I1 q1 J
            if (instance == null) {  
    * K# E* l/ v5 y# W9 S1 c            instance = new Singleton();  & O: u& ]( m  W$ f* P7 M! R
            }  / {0 l& U' i( k4 V: m  `
            return instance;  ) N. B  ~; X# ?: H" }7 }" B0 M& r
        }  ) |/ }3 [% k+ m4 O+ e
    }& @& Y/ f8 D6 ^& F. P

    2、懒汉式(线程安全)

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

    //懒汉式(线程安全)
    + R' j4 @' C' ^; Apublic class Singleton {  * l  l; b" w/ f2 Z8 H% M) p0 O
        private static Singleton instance;  
    0 [6 O5 l* J4 Z8 [$ o* b- W: T
      r/ V5 f9 y5 u1 r1 K    private Singleton (){}  
    5 A7 h$ d% z3 i. g1 N
    4 i; @, o2 X! D/ G& B9 m; j    public static synchronized Singleton getInstance() {  
    / M& i2 O: Q* N& z        if (instance == null) {  ' q& {, j6 r0 X/ B. \& S, F" J
                instance = new Singleton();  
    & j8 ^0 r" j1 s9 t" R( ?: C        }  " X) D5 N+ k. y+ X2 H
            return instance;  
    9 z  {5 g+ r. e, M% k4 x& i    }  : E7 K5 Q4 {1 d0 R7 g
    }
    9 f( g. w! G% d8 P& q: X
    % N0 ^- _: h' w

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

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


      f) I# l0 @1 G//双重校验锁& p, K7 j2 K% G! A6 Q
    public class Singleton {, {8 s6 @( D# i. Q% {
        private volatile static Singleton instance;
    & G3 t  z: s, C8 D" c+ _# U4 \
    " D3 L  ^. [) p+ ^; E    private Singleton() {7 F( P7 J* k8 w
    ' m5 x# B7 C6 i5 q% t- i7 m
        }
    5 F& Z6 P5 F* D, A
    * y2 s! K/ C0 g2 e( K    public static Singleton getInstance() {5 {9 W* J# ]. e# c- G
            if (instance == null) {( w2 b0 r4 s" z7 s: T
                synchronized (Singleton.class) {
    # e' X- U7 E( u                if (instance == null) {
    " N5 l) `5 s9 ^8 |3 Y+ f                    instance = new Singleton();
    / A3 Q$ F7 R  t" {                }
    0 A2 J' B1 S: p" s, I            }% f# L/ u  [1 y  j/ `5 `" n, C
            }
    - r- v* \8 `- R6 R& {. n% L8 P        return instance;9 n" S& T+ f7 R* Y+ X5 }
        }
    7 v- X! r  y; }}/ {1 O) e: X0 Y

    " i( H% Y6 ~1 U3 E, f1 d2 {  y  g$ T0 t

    4、饿汉式(线程安全)

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


    6 g- p7 k9 {( n# C//饿汉式# W- P5 P& ^; D' S7 U3 \8 m+ z
    public class Singleton {
    & Y/ G0 s# q# s# @$ A    private static Singleton instance = new Singleton();) T; s! L+ W5 _) v# R

    9 F+ T& @4 O3 D) J" z+ p- \    private Singleton() {
    5 ^8 a. M% x$ H* X/ y4 T( A) a# w5 v$ o2 i% ?0 R
        }
    2 X: {; }$ N9 I! q. w7 j0 b/ Z! R( ?5 b
        public static Singleton getInstance() {
    : R8 L( Y2 C4 Z" g* A8 ]# c        return instance;! o7 g6 x/ U7 Q6 q8 g' q2 v* `
        }
    3 T+ G  ?2 m, o6 I+ N* _% `$ m}
    ! j+ L  m$ c- ?+ \8 [! B7 z3 K8 n. H' c7 `) k

    - P# a8 _9 k( U: e) V# m

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

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

    //静态内部类
    " |- |* L1 @3 Y* }public class Singleton {
    9 |2 V& s8 N% }/ |+ R& ]    private static class SingletonHolder {2 n9 r/ {" w( l6 v/ T0 k" w
            private static final Singleton INSTANCE = new Singleton();+ A, a- d5 I9 v- U8 L! q, M7 `
        }
    ' a% l, S! c2 _" m
    6 f, ]% _0 I$ p' g4 \    private Singleton() {8 o7 g( J1 r! a6 g( b
    ; E& X) E/ R! _1 g6 E( f
        }4 m0 C( C0 L1 M" j2 R+ x) R: k, _
    ; y% y! h; p- U4 s
        public static final Singleton getInstance() {
    * Y! U0 R% z' B        return SingletonHolder.INSTANCE;  _. p& E4 h# D, x% T6 G# D2 E, I
        }: Z# {7 m; r  H8 u
    }
    * m! S2 x& w2 j, @9 L7 i: k# H+ W8 K( n( v( [& I

    6、枚举(线程安全)

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


    , H. a+ W2 z  |5 {//枚举: p" z% o" M6 F6 E( R7 Z1 U5 }
    public enum Singleton {
    0 C0 v$ O! h# G8 `- _; C3 M    INSTANCE;" K8 i; j0 |- C/ g9 }* H# y

    / ^, p  ~/ L7 O3 y2 I5 a- A    public void whateverMethod() {
    ( V1 _7 p( n; S( X! ~8 T* Z9 u3 l) o5 J/ w& i( v+ n
        }2 K9 V" N' @, _  \
    }" V: C' D& U) `2 W7 J

    $ G0 }- Z0 p8 h8 c! `
    2 I' @: c2 V! I总结8 r3 D2 b6 e& a/ {8 ?
    + b& q! @8 D9 ~7 t
    一般情况下,不建议使用第1种和第2种懒汉方式,建议使用第4种饿汉方式。只有在明确实现lazy loading时,才会使用第5种静态内部类方式。如果涉及到反序列化创建对象时,可以使用第6种枚举方式。如果有其他需求,可以考虑使用第3种双重校验锁方式。
    / V, |/ O, x$ D! m3 LPS:开始面临着春招,好多面经都有说到设计模式。最常见的面试题就是讲一讲单例模式的实现和理解,所以我写一下,加深我对单例模式的理解和印象。觉得对你有帮助的话可以点点赞,谢谢啦~~~
    - c# b  {8 Q' s+ Y) Q————————————————
    - s7 }5 T* B2 l1 t2 {0 z; V5 }* I8 \7 ?# j
      x; ^/ d# j1 l7 T8 W# d, N; ?
    9 c# u1 |  M7 b

    , }) q3 ]9 g1 k* w! h; o( p  S6 {
    , Y+ t; `" r3 z# N. C8 n- l% D* Z+ D

    6 M- j* F) Q$ v" m5 o8 E0 f  K0 W% N" s/ |: m9 f$ I
    , B  N$ a' j: J! H4 J" C+ y7 W- E/ O9 c
    原文链接:https://blog.csdn.net/weixin_37686415/article/details/105164764$ l/ X* P' ~* \8 S5 Q6 j+ [- }. Z

    / O5 z- o  F3 f& S
    ' |* Q! |2 d( W3 e( N2 K
    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-4-20 13:26 , Processed in 0.406270 second(s), 62 queries .

    回顶部