浏览 2153 次
锁定老帖子 主题:实现单例的时候使用双重加锁
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-05-05
最后修改:2013-05-05
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确实是一个单例的,但是多个线程同时获取的时候,对象可能还没有构建完全完成,那么这时候对象的状态是失效的,意味着线程可以看到对象处于无效或错误状态。 如果大家在工作中也出现了类似的情况,希望可以借鉴下,反正不要犯我这种低级错误就行了。 ![]() 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-05-08
关于单例和双检锁,已经成月经贴了
|
|
返回顶楼 | |
发表时间:2013-05-10
要lazy的话,要么volatile+双重检测,要么使用类加载的的内部类
要么不要lazy,像manager这些东西,完全没必要lazy load |
|
返回顶楼 | |