专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
51好读  ›  专栏  ›  程序员大咖

Java设计模式:单例模式

程序员大咖  · 公众号  · 程序员  · 2018-05-10 10:24

正文

请到「今天看啥」查看全文


() {
return instance;
}

//1和2选一种即可,推荐2
}


对于饿汉模式来说,这种写法已经很‘perfect’了,唯一的缺点就是,由于instance的初始化是在类加载时进行的,类加载是由ClassLoader来实现的,如果初始化太早,就会造成资源浪费。


当然,如果所需的单例占用的资源很少,并且也不依赖于其他数据,那么这种实现方式也是很好的。


类装载的时机:

  • new一个对象时

  • 使用反射创建它的实例时

  • 子类被加载时,如果父类还没有加载,就先加载父类

  • JVM启动时执行主类 会先被加载


懒汉模式

懒汉模式的代码如下

// 代码一
public class Singleton {
private static Singleton instance = null ;
private Singleton ( ) {
}
public static Singleton getInstance ( ) {
if (instance == null ) {
instance = new Singleton();
}
return instance;
}
}


每次获取instance之前先进行判断,如果instance为空就new一个出来,否则就直接返回已存在的instance。


这种写法在单线程的时候是没问题的。但是,当有多个线程一起工作的时候,如果有两个线程同时运行到 if (instance == null),都判断为null(第一个线程判断为空之后,并没有继续向下执行,当第二个线程判断的时候instance依然为空),最终两个线程就各自会创建一个实例出来。这样就破环了单例模式 实例的唯一性,要想保证实例的唯一性就需要使用synchronized,加上一个同步锁:

// 代码二
public class Singleton {
private static Singleton instance = null ;
private Singleton () {}

public static Singleton getInstance () {
synchronized (Singleton.class){
if






请到「今天看啥」查看全文


推荐文章
潮人  ·  潮流壁纸精选 | 2016-12-14
8 年前
槽边往事  ·  野味之味
8 年前
深焦DeepFocus  ·  戛纳70周年获奖名单及深焦报道合辑
8 年前