浅谈单例设计模式: <Excerpt in index | 首页摘要>
单例设计模式以及java语言简单实现
<The rest of contents | 余下全文>
单例设计模式(浅谈)
什么是设计模式 (Design Pattern)
设计模式是一套被人反复使用、多数人知晓、经过分类的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络。
单例模式 (Singleton) 最常用的、最简单的设计模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
保证在整个应用中某一个类有且只有一个实例(一个类在内存中只存在一个对象),即所有的指向该类型实例的引用都指向同一块内存空间。
单例设计模式实现的步骤:
必须在类中自己先创建一个对象
私用自身的构造器,防止外界通过构造器创建新的对象
向外提供一个公共静态方法用于获取自身的对象
代码实现:
饿汉式
1 | public class SingletonDemo{ |
懒汉式(存在线程不安全)
1 | public class SingletonDemo{ |
关于懒汉式单例模式线程安全的解决方案
双重检查锁
可以使用“双重检查加锁”的方式来实现,就可以既实现线程安全,又能够使性能不受很大的影响。
什么使双重检查加锁机制
所谓双重加锁机制,指的是:并不是每一个进入getInstance方法都需要同步,而使先不同步,进入方法后先检查是否存在实例,如果不存在才进行下面的同步块,只是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。
双重检查锁加锁机制实现会使用关键字volatile,它的意思是:被volatile修饰的变量的值将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
注意:在Java1.4及以前的版本中,很多jvm对于volatile关键字的实现的问题,会导致“双重检查加锁”的失败,因此“双重检查加锁”机制只能用Java5以上的版本。
提示:由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以效率并不是很高。因此一般建议,没有特别的需要,不要使用。也就是说,虽然可以使用“双重检查加锁”机制来实现线程安全的单例,但是并不建议大量采用。