单例模式:深潜水

单例设计模式基本上是用来控制创建许多对象,因此属于家庭创建模式。

早期的趋势是创建一个马克斯的对象,但在某些情况下,我们需要一个固定数量的对象; 这种模式是正确的,来帮助我们。 通常,我们构造函数标记为私有,以确保外部世界不能创建对象,提供了一个静态方法,简单地返回对象。 它创建一个物体只有在没有事先创建。

随着时间的推移,人们意识到这种香草的实现单例,几个问题,这是改善来解决这些问题。 注意,单件不对错; 只要适合你的问题域。

在这次演讲中,我们将看看不同实现的单例。

让我们看看类图:

Paste_Image.png

单使用
有几个地方是明智的使用单例模式。 例如:日志记录、缓存、负载平衡、配置、通信(IO避免表现不佳或远程)和数据库连接池。 单例的Java API的一个例子是运行时类。

单例实现
这是香草的方式使用一个立即加载机制,实现一个单例是线程安全的。

public class MySingleton {
     private static final MySingleton mySingleton = new MySingleton();
     private MySingleton(){}     
     public static MySingleton getInstance(){
        return mySingleton;
     }
}

另一方面,这里有一个例子使用延迟加载机制实现单例。 在多线程应用程序中,这将是一个糟糕的方法。

class MySingleton {
     private static MySingleton mySingleton;
     private MySingleton(){}
     public static MySingleton getInstance(){
           if(null == mySingleton) {
                 mySingleton = new MySingleton();
           }
           return mySingleton;
     }
}

一个多线程的方法可以避免竞态条件,以确保它不会违反一个单例的哲学。 但是在下面的例子中,使整个方法“同步”并不是一个好方法,因为我们需要把锁对象创建语句。

class MySingleton {
     private static MySingleton mySingleton;
     private MySingleton(){}
     public synchronized static MySingleton getInstance(){      
        if(null == mySingleton) {
           mySingleton = new MySingleton();
        }
        return mySingleton;
     }
}

下面的多线程的实现方式可以避免竞态条件,以确保它不会违反独立的哲学和双重检查锁定的帮助下使用对象级别的锁会达到相同的。 这个实现保证线程安全; 但一直锁所需的额外的对象是这不是一个很好的实践。 另一个缺点是,有人可以使用类级别锁你的锁的优点是在一个不同的对象

class MySingleton {
  private static MySingleton mySingleton;
  private static final Object lock = new Object();
  private MySingleton(){}
  public static MySingleton getInstance(){
     if(null == mySingleton) {
         synchronized(lock) {
            if(null == mySingleton) {
               mySingleton = new MySingleton();
            }
         }   
     }
     return mySingleton;
  }
}

另一个multi-threaded-based实现(避免竞态条件)的帮助下可以实现双重检查锁定使用类级别锁。 在这里,将MySingleton对象标记为不稳定将确保变化由一个线程应该在另一个是可见的。 这个实现保证线程安全。

class MySingleton {
    private volatile static MySingleton mySingleton;
    private MySingleton() {}
    public static MySingleton getInstance() {
        if (null == mySingleton) {
            synchronized(MySingleton.class) {
                if (null == mySingleton) {
                    mySingleton = new MySingleton();
                }
            }
        }
        return mySingleton;
    }
}

这意味着实现提供了一个聪明的构造函数,将停止单合同违反使用反射。

class MySingleton {
    private volatile static MySingleton mySingleton;
    //Reflection can't hack to create more than one object.
    private MySingleton() throws Exception {
        if (null == mySingleton) {
            mySingleton = new MySingleton();
        } else {
            throw new Exception("It's a singleton class; don't expect more object to get produced");
        }
    }
    public static MySingleton getInstance() throws Exception {
        if (null == mySingleton) {
            synchronized(MySingleton.class) {
                if (null == mySingleton) {
                    mySingleton = new MySingleton();
                }
            }
        }
        return mySingleton;
    }
}

这是一个非常受欢迎的实现使用一个静态类,这带来了延迟加载和线程安全的权力。

public class MySingleton {
    private MySingleton() {}
    private static class SingletonUisngInner {
        private static MySingleton mySingleton = new MySingleton();
    }
    public static MySingleton getInstance() {
        return SingletonUisngInner.mySingleton;
    }
}

在某些情况下,如果你的单例类继承接口可克隆属性,那么你的单例类需要格外小心,防止单例设计合同。 你的单例类应该覆盖的克隆方法和显式地抛出CloneNotSupportedException。

class ClonedClass implements Cloneable {
    //Some logic
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class MySingleton extends ClonedClass {
    private MySingleton() {}
    private static class SingletonUisngInner {
        private static MySingleton mySingleton = new MySingleton();
    }
    public static OneMore getInstance() {
        return singletonUisngInner.mySingleton;
    }
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
}

另一个,我们的决赛,非常受欢迎的和智能的方法实现单例使用枚举,而照顾我们到目前为止的所有问题。

public enum  EnumSingleton{
    INSTANCE;
}

有时,人们谈论单件跨多个jvm,让我们触摸。 单身意味着只有一个对象,我们非常清楚,JVM对象生命周期管理,所以一个共享对象跨多个JVM是不可能的。

但是如果你需要,你可以在一个JVM中创建对象并分发它作为一个序列化的对象,可以使用其他JVM(但是记住,你反序列化,那么请记住,任何静态或标记为瞬态将无法实现,某个地方,打破了单合同)。 你也可以尝试使用RMI服务器对象作为单件来适应您的需要。

学习快乐!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,221评论 11 349
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,236评论 4 34
  • 酒吧夜店让我想起一首歌:一起摇摆。这首歌最能体现出在酒吧里的男男女女,摇摆着身体跟着音乐一起疯狂的舞动。酒吧是寻欢...
    21029cbbb386阅读 752评论 0 0
  • 昨夜秋雨倚风悄入,今偶感丝丝凉凉意 午间诗意兴起执卷,拜读纳兰性德雅作 容若能文能武能诗,妙笔敢爱敢恨敢歌 一代国...
    Alex0309阅读 367评论 0 0