论坛首页 移动开发技术论坛

单例模式的标准写法、注意事项、作用及测试

浏览 4075 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-09-09  

最新最准确内容建议直接访问原文:单例模式

 

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

public class Singleton {

    private static volatile Singleton instance = null;

    // private constructor suppresses
    private Singleton(){
    }

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

        return instance;
    }
}

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、单例模式测试

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

 

你可能还感兴趣:

Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)

Android ImageCache图片缓存

Android性能优化专题

   发表时间:2013-09-13  
楼主还应该在“需要注意的点”上再加上一条,要使用volatile修饰static变量,以保证一个线程写对多个线程读情况的及时可见性,这样才能确保在单个vm实例中真正的singlton
0 请登录后投票
   发表时间:2013-09-14  
看一下effective java吧,最好的是使用枚举实现单件模式。
0 请登录后投票
   发表时间:2013-09-15  
java concurrency in prictice 中提到DCL有些缺点,但实际使用也没啥子问题,不过里面提到用单独一个单例工厂方法,利用java虚拟机的特性,在加载类的时候实现单例不错,楼主居然用闭锁,这想法不错,但觉得有些不妥,
0 请登录后投票
   发表时间:2013-09-16  
qifan.yang 写道
java concurrency in prictice 中提到DCL有些缺点,但实际使用也没啥子问题,不过里面提到用单独一个单例工厂方法,利用java虚拟机的特性,在加载类的时候实现单例不错,楼主居然用闭锁,这想法不错,但觉得有些不妥,

闭锁只是用来进行并发的测试
0 请登录后投票
   发表时间:2013-09-16  
arthur8 写道
楼主还应该在“需要注意的点”上再加上一条,要使用volatile修饰static变量,以保证一个线程写对多个线程读情况的及时可见性,这样才能确保在单个vm实例中真正的singlton

嗯,是的,感谢提醒
0 请登录后投票
   发表时间:2013-10-13  
恩,还有一种,是内部静态类,也不错
0 请登录后投票
   发表时间:2013-10-13  
这种方式并非最好,如果在分布式序列化下。最好的一种是用枚举,更次点也是内部类
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics