- Trinea
- 等级:
- 性别:
- 文章: 39
- 积分: 310
- 来自: 杭州
|
最新最准确内容建议直接访问原文:单例模式
主要介绍单例模式的标准写法、注意事项、作用、测试,以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性能优化专题
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- arthur8
- 等级: 初级会员
- 性别:
- 文章: 8
- 积分: 30
- 来自: 北京
|
楼主还应该在“需要注意的点”上再加上一条,要使用volatile修饰static变量,以保证一个线程写对多个线程读情况的及时可见性,这样才能确保在单个vm实例中真正的singlton
|
返回顶楼 |
|
|
- greenmoon
- 等级: 初级会员
- 性别:
- 文章: 1
- 积分: 30
- 来自: 北京
|
看一下effective java吧,最好的是使用枚举实现单件模式。
|
返回顶楼 |
|
|
- qifan.yang
- 等级: 初级会员
- 文章: 2
- 积分: 30
|
java concurrency in prictice 中提到DCL有些缺点,但实际使用也没啥子问题,不过里面提到用单独一个单例工厂方法,利用java虚拟机的特性,在加载类的时候实现单例不错,楼主居然用闭锁,这想法不错,但觉得有些不妥,
|
返回顶楼 |
|
|
- Trinea
- 等级:
- 性别:
- 文章: 39
- 积分: 310
- 来自: 杭州
|
qifan.yang 写道 java concurrency in prictice 中提到DCL有些缺点,但实际使用也没啥子问题,不过里面提到用单独一个单例工厂方法,利用java虚拟机的特性,在加载类的时候实现单例不错,楼主居然用闭锁,这想法不错,但觉得有些不妥,
闭锁只是用来进行并发的测试
|
返回顶楼 |
|
|
- Trinea
- 等级:
- 性别:
- 文章: 39
- 积分: 310
- 来自: 杭州
|
arthur8 写道 楼主还应该在“需要注意的点”上再加上一条,要使用volatile修饰static变量,以保证一个线程写对多个线程读情况的及时可见性,这样才能确保在单个vm实例中真正的singlton
嗯,是的,感谢提醒
|
返回顶楼 |
|
|
- z390174504
- 等级: 初级会员
- 文章: 5
- 积分: 30
- 来自: 南京
|
恩,还有一种,是内部静态类,也不错
|
返回顶楼 |
|
|
- yangfuchao418
- 等级: 初级会员
- 性别:
- 文章: 382
- 积分: 0
- 来自: 上海
|
这种方式并非最好,如果在分布式序列化下。最好的一种是用枚举,更次点也是内部类
|
返回顶楼 |
|
|