09/05
2013

单例模式

主要介绍单例模式的一种写法、注意事项、作用、测试,以Java语言为例,下面代码是目前见过最好的写法:

1、需要注意的点

其中需要注意的点主要有三点
(1) 私有化构造函数
(2) 定义静态的Singleton instance对象和getInstance()方法
(3) getInstance()方法中需要使用同步锁synchronized (Singleton.class)防止多线程同时进入造成instance被多次实例化
可以看到上面在synchronized (Singleton.class)外又添加了一层if,这是为了在instance已经实例化后下次进入不必执行synchronized (Singleton.class)获取对象锁,从而提高性能。

Ps: 也有实现使用的是private static Object    obj      = new Object();加上synchronized(obj),实际没有必要多创建一个对象。synchronized(X.class) is used to make sure that there is exactly one Thread in the block.

 

2、单例的作用
单例主要有两个作用
(1) 保持程序运行过程中该类始终只存在一个示例
(2) 对于new性能消耗较大的类,只实例化一次可以提高性能

 

3、单例模式测试

单例模式可以使用多线程并发进行测试,代码如下:

其中CountDownLatch latch为闭锁,所有线程中都用latch.await();等待锁释放,待所有线程初始化完成使用latch.countDown();释放锁,从而达到线程并发执行Singleton.getInstance()的效果。

Posted@2013-09-05 08:50:34, Filed under by

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

14 thoughts on “单例模式

  1. public static Singleton getInstance() {
    // if already inited, no need to get lock everytime
    if (instance == null) {
    synchronized (Singleton.class) {

    内层的同步 是多余的,因为 public static 就是类级别的同步方法了。

  2. 我常见写法偏向是:public class AppStateProvider { private AppStateProvider() {} private static class AppStateProviderHolder { private static AppStateProvider appStateProvider = new AppStateProvider(); } public static AppStateProvider getInstance() { return AppStateProviderHolder.appStateProvider; }}

  3. Pingback: cnblogs: 单例模式的标准写法、注意事项、作用及测试 – Trinea 易站|工作室 | 易站|工作室