Lion X

浅谈单例设计模式: <Excerpt in index | 首页摘要>
单例设计模式以及java语言简单实现

<The rest of contents | 余下全文>

单例设计模式(浅谈)

什么是设计模式 (Design Pattern)

设计模式是一套被人反复使用、多数人知晓、经过分类的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络。

单例模式 (Singleton) 最常用的、最简单的设计模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
保证在整个应用中某一个类有且只有一个实例(一个类在内存中只存在一个对象),即所有的指向该类型实例的引用都指向同一块内存空间。

单例设计模式实现的步骤:

  1. 必须在类中自己先创建一个对象

  2. 私用自身的构造器,防止外界通过构造器创建新的对象

  3. 向外提供一个公共静态方法用于获取自身的对象

代码实现:

饿汉式

1
2
3
4
5
6
7
public class SingletonDemo{
private static SingletonDemo singleton = new SingletonDemo();
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return singleton;
}
}

​ 懒汉式(存在线程不安全)

1
2
3
4
5
6
7
8
9
10
public class SingletonDemo{
private static SingletonDemo singleton;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(singleton == null){
singleton = new SingletonDemo();
}
return singleton;
}
}

关于懒汉式单例模式线程安全的解决方案

双重检查锁

可以使用“双重检查加锁”的方式来实现,就可以既实现线程安全,又能够使性能不受很大的影响。

什么使双重检查加锁机制

所谓双重加锁机制,指的是:并不是每一个进入getInstance方法都需要同步,而使先不同步,进入方法后先检查是否存在实例,如果不存在才进行下面的同步块,只是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。

双重检查锁加锁机制实现会使用关键字volatile,它的意思是:被volatile修饰的变量的值将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。

注意:在Java1.4及以前的版本中,很多jvm对于volatile关键字的实现的问题,会导致“双重检查加锁”的失败,因此“双重检查加锁”机制只能用Java5以上的版本。

提示:由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以效率并不是很高。因此一般建议,没有特别的需要,不要使用。也就是说,虽然可以使用“双重检查加锁”机制来实现线程安全的单例,但是并不建议大量采用。

 Comments