QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2038|回复: 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
    浅谈单例模式的实现方式
    3 C: `* b3 b0 A! D6 C: K# \单例模式(来自菜鸟教程)
    4 v' c4 L% T/ P7 I! a* p2 P+ |; Q) m& S; m4 G2 M' V; I
    单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
    6 q6 A1 O+ w) k, D4 k! W单例模式的要求
    , F. T8 `2 P8 y; p5 I3 I; _9 Z6 z# r: Y7 y
    构造方法必须私有化(确保只有自己能创建). ?9 c$ Y0 M4 d3 {% |9 I* s
    以静态方法返回实例(外界不能通过new来获取到对象)4 E- i; b4 \% T! y6 ^* }4 ~
    确保对象实例只有一个(只对类进行一次实例化,以后都直接获取第一次实例化的对象)
    # S) W+ c0 N: b+ ~/ Q单例模式的实现( F3 w4 S% s. S" i

    3 z$ y) O$ E4 O1、懒汉式(线程不安全)
    % Z& U" i6 D% A+ c8 ^1 E( b
    1 f6 @, ?' Y) Q; [1 v6 d描述:这种方式是最基本的实现方式,但是不支持多线程。因为没有加锁,在多线程不能正常工作, E/ t9 G: F! f7 K* ]) t1 h
    //懒汉式(线程不安全)( ?* H; w# O8 i6 s. g3 h6 T# F
    public class Singleton {  - X3 \9 ]& M8 a$ S# i% s0 y- q
        private static Singleton instance;  3 |( f( d1 p. M

    & g6 {2 _2 d- ]! A; p4 I  W' _7 ~! e. f    private Singleton (){}  
    - ~  }1 u, ^# D* n2 I: @' P1 X- n* T! B- s
        public static Singleton getInstance() {  8 V9 H) Z' k  a
            if (instance == null) {  
    8 u! N2 Y; j( v8 U            instance = new Singleton();  9 d$ e" [, N0 Q3 O
            }  
    ! F- }  j8 O1 _  N        return instance;  ! ]2 J1 R: h. X: g8 z) D0 K
        }  
    , m: Y; v5 H. m5 o+ f}
    + F. v3 _% `8 v. w1 x* N

    2、懒汉式(线程安全)

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

    //懒汉式(线程安全)
    6 t" R; B3 I# l3 ppublic class Singleton {  7 M* _$ s6 z0 `6 w# K
        private static Singleton instance;  6 K6 ]7 i& w' c) d# ^7 u
    " d8 L3 S9 F: v2 q
        private Singleton (){}  
    ! a  L0 [9 y( f6 I! \/ {, F7 g
    $ l" J( t% t4 y    public static synchronized Singleton getInstance() {  
    , ]' U: B6 @' u) }9 T1 H        if (instance == null) {  
    & W/ X/ {7 D$ m7 @            instance = new Singleton();  
    * w- I" _2 t6 m        }  
    3 V/ T2 P+ E) {        return instance;  * U+ [% C8 W5 X% }( [
        }  
    " z) y  ?8 s- e8 \}
    * D4 V. y7 ~( ~+ Y8 f6 d% r$ l, F6 |' ?5 S! |) H5 i

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

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


    2 U9 i7 H1 ]+ A* n5 |//双重校验锁: a# Z* E: Y* z
    public class Singleton {- r. C2 F  {  G! P; N5 w( ~
        private volatile static Singleton instance;( b5 [4 ]) |* S  N

    7 m% k7 @+ {4 c) D/ F9 y. ~0 H1 y    private Singleton() {
    0 c7 d( O5 o* U' M/ ~1 A& |
    0 L; t( \3 `) e- Z    }! g" x! t+ T4 K) a0 l+ j! B

    * W9 [6 i) l; {( f+ J$ ~, @    public static Singleton getInstance() {; q" |9 K! J: c/ {
            if (instance == null) {$ z8 F! i  j1 b9 T% O
                synchronized (Singleton.class) {
    " T- R. }% u7 L/ G                if (instance == null) {
    ; {4 f% |6 m6 z9 Z$ d3 l% `5 r                    instance = new Singleton();7 U' P6 \+ m7 q6 j$ M/ |
                    }8 R# x6 h' u/ v( B2 {9 l
                }) D- J5 [, S; O" X* D
            }! L6 {! T7 i2 \
            return instance;
    & c0 l$ k& I/ d% y+ n, Y    }: }2 Y+ c6 h5 e3 {$ I0 Q
    }
    8 F" H0 C# h' `, e! K. ^+ [
    5 u+ T/ z6 Q5 m# j  a7 \5 A. w0 u& b7 L, X6 i

    4、饿汉式(线程安全)

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


    - Z, F8 Z2 M; h/ M5 @9 o' Q& \//饿汉式
    ) O" g1 l& f; y# K) h4 h' ypublic class Singleton {
    " Z5 }8 E, y$ p5 L/ G- _. C( L    private static Singleton instance = new Singleton();) z6 y) _' y6 A& V
    5 Q! D; J0 o0 ^" E4 h  I
        private Singleton() {
    6 D; s% n) }) V+ ~+ H6 D" ~
    $ E$ V+ t- c6 D+ ~' f/ Z6 t5 T    }+ J: f; l* }; |4 m5 P. j2 I
    " s" g/ d4 @: M1 l& V
        public static Singleton getInstance() {
    ( m! @* h  ^+ R* `        return instance;: f- ^/ e- r! ^( j9 F2 i
        }" p6 _/ S) Y2 K' C( m( Q7 I: t/ s8 G
    }- f$ ~) i( W3 c; Z

    & m0 V4 V% L! ]1 O
    / ]# S, f7 T0 d" E# n7 l7 I

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

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

    //静态内部类+ U0 E7 H( F) }$ G9 P# I
    public class Singleton {9 z8 G6 ~8 {) C" s; L! e$ F( t3 m+ C
        private static class SingletonHolder {
    ! i  t. Q; g& h% i, c9 c        private static final Singleton INSTANCE = new Singleton();
    9 H) ^$ y& m( W) t    }
    % H# k" ?9 t3 h  [3 t/ |: _, S6 ~
    1 K6 }1 r( j2 Y( ~0 K9 ^    private Singleton() {
    7 b* A: b0 `! C8 N9 K
    0 |1 n9 K/ h5 I9 `8 m    }" G: b6 c; ]) \$ E% d( s

    ' S) A7 I! w  F5 S- ?    public static final Singleton getInstance() {
    / @" B# \3 v. X        return SingletonHolder.INSTANCE;1 u4 W7 k" x8 W! t* ?; v6 y
        }
    8 T% W$ l- ~% p3 R3 F$ h}
    ! U) }. |, g/ P6 O/ S4 u
    5 ^$ j2 t0 D. j/ q, k

    6、枚举(线程安全)

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

    3 H% {. c9 P, ]6 R% M4 P
    //枚举
    : k' V9 p8 d/ q0 o& Apublic enum Singleton {; m+ j+ m7 t- ^4 P6 n$ A7 K% |
        INSTANCE;
    ) x/ ^# u5 z# k9 a  v- z, y8 P9 f  T7 o. C( Z- R' q, O
        public void whateverMethod() {
      `& D1 X) i, D) _7 [6 M* n8 v2 N) \1 l  M/ S, q8 K2 Z8 G6 p3 O. N; o7 [. M
        }
    # {" Z  I& a$ h4 O- o: f* w  C9 D}% u* X* V1 w5 C3 D2 g$ l; f) Y$ b2 |
    2 s4 U" M6 q8 T1 Y  V/ C" S

    " s8 l  d8 L2 e  D) ]# Y- X总结
    6 u5 E% G0 D) K3 ~& y8 _- L  _! o9 Z3 d8 l. Y
    一般情况下,不建议使用第1种和第2种懒汉方式,建议使用第4种饿汉方式。只有在明确实现lazy loading时,才会使用第5种静态内部类方式。如果涉及到反序列化创建对象时,可以使用第6种枚举方式。如果有其他需求,可以考虑使用第3种双重校验锁方式。
    3 ~5 |4 @) j2 l0 s, z8 [0 t' TPS:开始面临着春招,好多面经都有说到设计模式。最常见的面试题就是讲一讲单例模式的实现和理解,所以我写一下,加深我对单例模式的理解和印象。觉得对你有帮助的话可以点点赞,谢谢啦~~~
    : p" ^0 ^) e" O4 \7 U————————————————
    . J1 @* [6 R! M1 G
    $ M0 B0 W6 L/ x& V4 n! d& T
    - ?- G" {, z) m* p. m6 G
      H! f" ]: l; _7 }+ U5 r
    8 }9 t9 P2 @+ O7 c9 @. a
    / ]: W# `; E# i* k* u1 h! U+ E7 }7 ^/ i$ V1 f/ b* o% H6 g

    5 ~5 ?7 E2 D1 T
    3 Q* }5 K$ a% H& H. Z; ~
    . I. C) p8 ]- Q9 D8 R5 ]* Z原文链接:https://blog.csdn.net/weixin_37686415/article/details/1051647643 j; V1 @  P) \4 \- |
    . M" E$ v' y* f% h7 d9 p
    ( F% a+ T" t  N
    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-9-9 18:15 , Processed in 0.446724 second(s), 62 queries .

    回顶部