论坛首页 入门技术论坛

实现单例的时候使用双重加锁

浏览 2153 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-05-05   最后修改:2013-05-05
最佳在项目里面要写一个缓存任务管理器CacheTaskManager,后来测试的老是出现bug,后来发现这个管理器是一个单例的模式,很多线程会同时访问它,它的初始化语句是这样的:
private static CacheTaskManager instance;
public static CacheTaskManager getInsance() {
	if (instance == null) instance = new CacheTaskManager();
	return insance;
}


后来发现这个不是线程安全的,然后就改了:
private static CacheTaskManager instance;
public static CacheTaskManager getInsance() {
	if (instance == null) 
		synchronized (CacheTaskManager.class) {
			if (instance == null) instance = new CacheTaskManager();
		}
	return insance;
}

这个总该安全了吧,但是在压力测试情况下还是会出现一些莫名其妙的bug。到后来去翻阅了下《Java Concurrency In Practice》才发现了问题的所在。虽然获取的instance确实是一个单例的,但是多个线程同时获取的时候,对象可能还没有构建完全完成,那么这时候对象的状态是失效的,意味着线程可以看到对象处于无效或错误状态。
如果大家在工作中也出现了类似的情况,希望可以借鉴下,反正不要犯我这种低级错误就行了。
   发表时间:2013-05-08  
关于单例和双检锁,已经成月经贴了
0 请登录后投票
   发表时间:2013-05-10  
要lazy的话,要么volatile+双重检测,要么使用类加载的的内部类

要么不要lazy,像manager这些东西,完全没必要lazy load
0 请登录后投票
论坛首页 入门技术版

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