java 板


LINE

各位板友好,最近遇到了一个跟 Singleton? 有关的问题想请教一下, 程式码是凭印象大略打的,所以有误的话还请见谅 QQ class Single { private static Single mInstance; public static Single getInstance() { if (mInstance == null) { mInstance = new Single(); } return mInstance; } private Single(){} public static void reset() { mInstance = null; } } 这是一个简单的 singleton,先忽略第一次 getInstance() thread safe的问题, 这个instance会在程式内被很频繁的使用到, 当遇到某个特别的情况时, "必须"要把 call reset() 这个方法来让 mInstance 重新 new, 但 call reset() 跟 call getInstance() 是不同的 thread, 由於是不同thread所以在 reset() 後 getInstance() 有机率造成 NPE, 所以我把 Single 程式稍微修改一下如下 SingleA class SingleA { private static SingleA mInstance; private static final Object SYNC = new Object(); public static SingleA getInstance() { synchronized(SYNC){ if (mInstance == null) { mInstance = new SingleA(); } } return mInstance; } private SingleA(){} public static void reset() { synchronized(SYNC){ mInstance = null; mInstance = new SingleA(); } } } 说到这里,想请问的问题有几个, 1. 想确认第一段程式码中造成 NPE 是否真的是因为 thread unsafe的关系? (程式码中都会把 getInstance 用一个 local variable 存起来, 例如 Single single = Single.getInstance(); ) 造成的原因是 thread 1 call getInstance 当通过 if(mInstance == null) 的判断後 thread 2 call reset 所以导致 thread 1 最後 return null 吗? 2. 如果问题一中我的推论是正确的 (也就是 npe 是 thread unsafe 造成的) 那请问 SingleA 这样修改是正确(正确的定义是 thread safe) 的吗? 3. 如果 SingleA 是 thread safe 的话,想请问有没有其他更好的方法 可以达成呢?因为 getInstance() 会很频繁的使用,所以不太希望 里面会有 synchronized 。 如果有什麽不清楚的还请见谅 QQ --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.114.160
1F:推 qrtt1:http://stackoverflow.com/a/16106598/90909 12/29 10:24
2F:→ qrtt1:有些东西自己写容易错的就尽管用抄的吧。 12/29 10:25
3F:→ qrtt1:如果不是维护旧东西,我大概都用 IoC Container 来做它。 12/29 10:27
QQ 但这是个数十万行架构的程式码 小弟把问题先简化而已 在以前的情况下因为可以保证第一次new instance 是thread safe, 而且也不会把 instance 设成 null,所以以前没遇到这种问题。 ※ 编辑: qweqweqweqwe 来自: 220.135.114.160 (12/29 12:58)
4F:→ qrtt1:可是写法就不对了,至少 getInstance 要 static 啊 12/29 13:33
5F:→ qrtt1:而且还要加 synchronized (不考虑lazy initialization的话) 12/29 13:35
喔喔 不好意思忘了打上 static , 已经补上了谢谢提醒 另外上面有提到 系统第一次 Single.getInstance() 的 initialization 时"一定保证"是 thread safe , 所以原本的 Single.getInstance() 并不需要加上 synchronized。 ※ 编辑: qweqweqweqwe 来自: 220.135.114.160 (12/29 14:04) ※ 编辑: qweqweqweqwe 来自: 36.224.104.196 (12/29 20:29)
6F:推 qrtt1:回到最初的建议,这样随兴写太容易出错了。有些东西只能抄的 12/30 11:47







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP