关于 Java 单例模式的 Synchronized 的用法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Totato5749

关于 Java 单例模式的 Synchronized 的用法

  •  
  •   Totato5749 Dec 10, 2015 3148 views
    This topic created in 3792 days ago, the information mentioned may be changed or developed.
    1. public static Singleton getInstance() {
    2. if (instance == null) {
    3. synchronized (Singleton.class) {
    4. if (instance == null) {
    5. instance = new Singleton();
    6. }
    7. }
    8. }
    9. return instance;
    10. }

    我发现网上单例模式中 getInstance 方法基本上都是这么写的,我觉得这种写法虽然正确但是一点都不易读。 请教各位,像我下面这样写正确吗?

    public static synchronized Singleton getInstance(){
    if(mInstance == null){
    mInstance = new Singleton();
    }
    return mInstance;
    }

    15 replies    2015-12-10 14:44:13 +08:00
    rails3
        1
    rails3  
       Dec 10, 2015
    最好的静态内部类
    bqbkbz
        2
    bqbkbz  
       Dec 10, 2015
    经典案例啊,你这个性能要差很多
    zts1993
        3
    zts1993  
       Dec 10, 2015
    第一种 如果不为空 不用加锁,,你这个,自己没看出问题么。。。。
    xufang
        4
    xufang  
       Dec 10, 2015
    neo2015
        5
    neo2015  
       Dec 10, 2015
    public synchronized static Singleton getInstance(){
    if(mInstance == null){
    mInstance = new Singleton();
    }
    return mInstance;
    }

    private static class SingletonInstance{

    }
    sun2920989
        6
    sun2920989  
       Dec 10, 2015
    你的写法理论上说没问题 但是并发访问的时候不如第一种效率高 单例的东西 永远是需要生成的时候少 已经存在的时候多
    neo2015
        7
    neo2015  
       Dec 10, 2015
    public synchronized static Singleton getInstance(){
    if(mInstance == null){
    mInstance = SingletonInstanc.mInstance
    }
    return mInstance;
    }

    private static class SingletonInstance{
    private static Signleton mInstance = new Singleton()
    }
    SparkMan
        8
    SparkMan  
       Dec 10, 2015
    现在更流行用 enum 类型,比 double check 还牛逼
    pixstone
        9
    pixstone  
       Dec 10, 2015
    public static synchronized Singleton getInstance(){ 取方法的时候上锁。。。。这效率要多低啊。。。合理的上锁模式是 实例化的时候上锁 防止重复实例。
    baozijun
        10
    baozijun  
       Dec 10, 2015
    你这个每次获取对象时都是加锁的,效率非常低.上面的那个有对象直接返回,没有才加锁,然后判断 此时对象的状态 是否为空,空的话创建
    zouxcs
        11
    zouxcs  
       Dec 10, 2015
    静态内部类整一个
    Totato5749
        12
    Totato5749  
    OP
       Dec 10, 2015
    谢谢诸君,学到了很多。
    ganxiyun
        13
    ganxiyun  
       Dec 10, 2015
    我觉得楼主贴的 DCL 好像 java 不适用吧,难道现在可以这么用了?
    ganxiyun
        14
    ganxiyun  
       Dec 10, 2015
    DCL 不是用

    // Works with acquire/release semantics for volatile
    // Broken under Java 1.4 and earlier semantics for volatile
    class Foo {
    private volatile Helper helper;
    public Helper getHelper() {
    Helper result = helper;
    if (result == null) {
    synchronized(this) {
    result = helper;
    if (result == null) {
    helper = result = new Helper();
    }
    }
    }
    return result;
    }

    // other functions and members...
    }
    unique
        15
    unique  
       Dec 10, 2015
    About     Help     Advertise     Blog     API     FAQ     Solana     3493 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 55ms UTC 12:03 PVG 20:03 LAX 05:03 JFK 08:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86