Redian新闻
>
看到一个关于singleton的面试题
avatar
看到一个关于singleton的面试题# Java - 爪哇娇娃
l*k
1
【 以下文字转载自 LeisureTime 讨论区 】
发信人: leewalk (腰缠十五贯,骑鹤上扬州。), 信区: LeisureTime
标 题: 明安岭 第十七章 范老铲
发信站: BBS 未名空间站 (Sat Aug 24 01:08:47 2013, 美东)
第十七章《范老铲》
×××××××××××××××××××××××××××××××××
通常越不了解的人和事才越显得神秘。
在李二蛋几个孩子的眼里,吴神仙、邱瞎子、丁阎王和崔寡妇就如同西游记里的神
仙妖怪,在想象里头法力无边。而招娣的姥爷放羊的老范头几乎天天在营子里能看到,
倒让他们觉得不以为然。而且说起来老范头的故事和神仙、鬼怪、赖歹、熊瞎子什么的
都不沾边儿,所以在几个孩子的眼里这这老范头跟营子里的其他老头儿比也看不出什么
特殊的地方来。
高景瑞对自己这个老丈人很多时候也不了解。只是从自己媳妇儿嘴里听说老范头从
小就开始要饭,一直从辽东的旅顺要到沈阳,那年头叫奉天,跟着从奉天要到了辽西。
又从辽西往西走,不知怎么的有一年要饭就要到了南水泉营子,那年老范头才二十出头
的样子,一大早晨就昏倒在了村里的范秀才家门口,被范秀才给救了,等把老范头抬屋
子里头给救醒了之后,老范头倒地下就磕头,连呼“救命恩人,救命恩人,大恩大德,
永世不忘。”正赶着范秀才膝下无子,只有一个老闺女,就这么的就认了个干儿子,老
范头就被范秀才收留了,呆了两年之后范秀才觉得老范头是个老实人就把女儿也许给他
了,算是续下了范秀才家的香火。只是这老范家在这营子里却一直是小门小户。到了老
范头这一代还是没有儿子,生了四个闺女,倒是嫁的都不错。
这老范头其实在三十多年前明安县号召开挖明安水库的时候才在这明安岭下成了名
的,他不光有一套又快又巧的挖土石方的本事,听人说还有看山势起伏走向来找地下水
流的经验,最厉害的是他有一对顺风耳,据说贴到地上能听出十里地外的是骡子是马还
是驴的蹬地声儿,有传的更邪乎的说是听着声儿能说出公母儿来。
按齐家沟老邱瞎子的说法,老范头的本事之一古书上叫作“观山定水,伏地听针。
”说的就是他能通过观察地上的地势判断出地下的水流,再通过自己一对顺风耳能听出
地下水水流的走向和水位的高低。就是隔着墙掉地上一根针,他只要墙那头伏在地上一
听都能听出来。
老范头还有另一个本事是这明安岭下的乡亲们叫出来。唤作“一锨指井,三锨泉涌
。”说的是他只要在地上挖一铁锨土就能知道这个地方能不能打井,打井要打多深的井
。最多挖三铁锨,就能在地上挖出水来。这个“一锨指井”的能耐营子里好多人都见识
过。这“三锨泉涌”却是说有一回西沟的老王家打井,也没找老范头就在自家院子里头
挖井,结果挖了得有两丈多深,还是不见水。老王家一着急没办法就把老范头请了过去
,结果老范头下到坑里,趴在坑底听了听,抄起他自己的独门范家铁锨,不多不少,就
三铁锨,水就噌噌地往外汩。打那之后,周围营子谁家里挖井最后都要找到老范头儿来
挖最后的几锨,久而久之,这“三锨泉涌”就传了开去。
×××××××××××××××××××××××××××××××××
说起老范头的独门范家铁锨,那就得从那年修明安水库说起来。那时候各营子都得
出青壮劳动力参与水库建设,南水泉营子前后去了三四十口子,十个人一组,就是挖土
石方,上头每天派下来的任务,别的组都得连夜赶工才能完成。说也奇怪,就南水泉营
子老范头那一组例外,一帮人看着比别人轻快不少,也没夜里开过工,结果总能按时超
额完成任务。有人就开始瞎传说老范头会搬山卸岭的法术,天天晚上只要一烧个符儿,
就有那成群的仓粮鼠给他运土。谣言传的越来越邪乎最后都传到了工程总指挥刘工的耳
朵里。这刘工是坚决不信的,找个时间就专门看着老范头那一组干活,愣是放下手头的
那么多事儿连着盯着老范头干了三天。最后,这刘工一拍大腿,就冲老范头伸了个大拇
哥,连连说道:“人才!人才!人才啊!神铲啊!你这搬山卸岭的本事还真是不一般咧
!上报县委!全县!不!我看啊!可以考虑全省!全国!”
原来,这刘工仔细考察了之后,发现了老范头这一组挖土石方比别人快的秘密。首
先,这一组细化的分工明确,挖土石是一个小组,运土是一个小组,三个人力独轮车从
来就没有闲置的时间,总是在运土的路上。不像别的组,三个车先全都装满了再一起运
。其次,挖土和运土的人员总能互相轮换,挖土的两个人活儿累,运土的一个人活儿轻
快,三个人一组总能轮换着休息。到最后这十个人还能闲出一个来,照应着三个小组。
最后,这老范头在他们组的铁锨上动了点手脚,虽说也是普通铁锨,可跟普通铁锨比,
铁锨头中间往里凹,两边往里卷刃,而且两三天就磨一磨铁锨头,插铁锨把子的那个铁
圈子又缩了那么一下,所以铁锨把子探不到最里面,外头看着却比别人的铁锨长了那么
一手指头。虽说是普通铁锨改造的,可是老范头这铁锨铲土省劲儿,撬土不费力,带出
来的土还多。跟他们一比,其他组虽说也都是附近营子的青壮劳动力,可就是怎么拼命
干也干不完。
这刘工总结了老范头这组干活的经验之后,马上在所有小组里头,又特意找到几个
做过铁匠活的按照老范头的铁锨把工地的铁锨都改良了一遍,结果,挖土石方的工程比
计划还提前了十天完成,真正做到了“多、快、好、省建设社会主义”。为这,刘工得
到了地委的点名表扬,连老范头都跟着到邻近好几个县里头做工作报告。经过刘工这么
一宣传,这老范头就在明安岭下得了个“范老铲儿”的外号。
×××××××××××××××××××××××××××××××××
这一晚高景瑞领着徐二爷和冉九爷顺着营子里头的小道拐了两个弯就到了自己老丈
人范老铲儿的家门口。到了门口刚想敲门,却被两个老头儿给劝住了。高景瑞也是识趣
的人,于是也就客气了几句自顾自的回刘卫东家招呼着给三个老头子做菜、送菜的事情
。就在回刘卫东家的路上,却迎面碰到了招娣领着盼睇和二蛋一行五个孩子。
“丫头,你干啥去?”高景瑞好奇地问自己大女儿道。
“爹!我们去照应照应姥爷那边,等我三婶子那边做好菜端过来,也得有个人跑前
跑后的支应着点不?”招娣一脸认真地回答。
“恩。”
高景瑞沉吟了一会儿觉得说的很有道理,可又觉得哪里不对劲儿。也来不及深究,
跟着迈步就走了。边走边说道:“恩,丫头懂事啦。好好照顾姥爷啊。别忘了等姥爷他
们吃完了再上桌子。给我把狗剩子看住了。”一边心里想着这三个老头凑一块有什么事
儿之后还能跟招娣嘴里打听出来。
“知道啦!爹!”招娣边应着边领着几个人往老范头家奔去。
等到招娣和二蛋几个赶到了老范头儿家的大门口,就看徐二爷和冉九爷站在门外,
听动静老范头就站在门里。就听徐二爷顶着个罗锅子却使劲地支着头冲着门里喊话道:
“老合字儿,并肩子儿,上马送你一锭金,下马送你一锭银。大碗儿的喝烧酒,大块儿
的吃肥肉。要风得风,要雨得雨啊。”
门里的老范头却大声问道:“酒是什么酒?”
“张家的小烧锅啊!”徐二爷乐呵呵地喊道。
跟着两个人一个门里一个门外就像对暗号一般,一唱一和。
“肉是什么肉?”
“城东!城东啊!曹家的叫驴肉!”
“风叫啥风啊?雨又叫啥雨啊?”
“嘿嘿!嘿嘿!风就那老北风呗,咱家雨帅说啥雨就啥雨啊!”
“四公子里头有哪一位?”
“黄家的黄铁梅!”
“出门带没带手枪队?”
“不带?不带咱咋能叫草上飞。”
“大掌柜是不是海里蹦?”
“嘿嘿,咱家原是北邙山头的穿山甲。”
“好!好!好!一起拜完了三江好!”
“三十六弟兄上阵就是一窝蜂啊!”
说到这里,嘎然而止。只听得门里头的老范头儿几声长叹,喃喃语道“唉……徐罗
锅子,徐罗锅子,你还活着……我以为你早都死了呢。唉……”
而门外的徐二爷却是把头努力地支起来更高,望着夜空,仰天长啸了几声,声音里
却满是悲凉地说道:“当年奉天第一楼的三十六友,还活着的现在五个手指头都能掰过
来了。没想到啊,没想到,打从大帅被日本人炸死那年算,咱三十六友各奔东西,死的
死,亡的亡,这五十几年了,还能在这山沟子里头碰上你。说啥呀?啥都想说,啥都不
想说啊。”
跟着就是很长时间的沉默,冉九爷也愣在那里不知该说些什么。几个孩子更是大气
也不敢喘一声。此时时间仿似地上的雪,在这个腊月里头清冷的夜里也被冻得凝固了一
般。
×××××××××××××××××××××××××××××××××
avatar
g*e
2
Write a special singleton class, the class has one integer field, make sure
only one instance of this class will be instantiated for the same value of
the integer field.
jobhunting版有人给了个代码,我改了一下,高手看看对不对,谢谢. 用了double
lock checking
public class SpecialSingleton {
private final int i;
private volatile static SpecialSingleton instance = null;
private static ConcurrentHashMap
instanceMap = new ConcurrentHashMap();
avatar
s*e
3
沙发,爆米花。
avatar
J*n
4
学习了

sure

【在 g**e 的大作中提到】
: Write a special singleton class, the class has one integer field, make sure
: only one instance of this class will be instantiated for the same value of
: the integer field.
: jobhunting版有人给了个代码,我改了一下,高手看看对不对,谢谢. 用了double
: lock checking
: public class SpecialSingleton {
: private final int i;
: private volatile static SpecialSingleton instance = null;
: private static ConcurrentHashMap
: instanceMap = new ConcurrentHashMap();

avatar
l*k
5
范老铲的盗墓故事蓄力待发:)

【在 s*******e 的大作中提到】
: 沙发,爆米花。
avatar
g*g
6
This is correct, but not neccesarily the most efficient.
I would do it this way. And if create SpecialSinglton is
a heavy function, you can consider using Future. Check
the memoizer pattern.
instance = instanceMap.get(i);
if (instance == null) {
instance = new SpecialSingleton(i);
temp = instanceMap.putIfAbsent(i, instance);
if(temp != null) return temp;
}
return instance;

【在 g**e 的大作中提到】
: Write a special singleton class, the class has one integer field, make sure
: only one instance of this class will be instantiated for the same value of
: the integer field.
: jobhunting版有人给了个代码,我改了一下,高手看看对不对,谢谢. 用了double
: lock checking
: public class SpecialSingleton {
: private final int i;
: private volatile static SpecialSingleton instance = null;
: private static ConcurrentHashMap
: instanceMap = new ConcurrentHashMap();

avatar
s*e
7
有大帅撑腰那算是官盗了吧

【在 l*****k 的大作中提到】
: 范老铲的盗墓故事蓄力待发:)
avatar
g*e
8
谢谢好虫,忘记这个pubIfAbsent了...
有个问题,temp = instanceMap.putIfAbsent(i, instance),如果添加新元素,返回
的应该是null吧,这时候再返回instance,依然是null?

of
;

【在 g*****g 的大作中提到】
: This is correct, but not neccesarily the most efficient.
: I would do it this way. And if create SpecialSinglton is
: a heavy function, you can consider using Future. Check
: the memoizer pattern.
: instance = instanceMap.get(i);
: if (instance == null) {
: instance = new SpecialSingleton(i);
: temp = instanceMap.putIfAbsent(i, instance);
: if(temp != null) return temp;
: }

avatar
r*y
9
大神你灵感来自哪里,有空写个创作花絮说说是如何构思的吧~~~~

【在 l*****k 的大作中提到】
: 范老铲的盗墓故事蓄力待发:)
avatar
g*g
10
如果返回null,那就是你创建的放进去了,当然返回instance,
否则你的就没放进去,返回的是map里面的,所以返回temp.

【在 g**e 的大作中提到】
: 谢谢好虫,忘记这个pubIfAbsent了...
: 有个问题,temp = instanceMap.putIfAbsent(i, instance),如果添加新元素,返回
: 的应该是null吧,这时候再返回instance,依然是null?
:
: of
: ;

avatar
l*k
11
哈哈哈哈哈哈,先卖个关子,至于大帅为啥要找“吃臭的”高人
下一章就有交代,这个桥我还真是想了很长时间才想出来的~~~HOHOHOHO

【在 s*******e 的大作中提到】
: 有大帅撑腰那算是官盗了吧
avatar
g*e
12
啊,对,我没看清楚,前面instance已经创建好了。呵呵不好意思。谢谢

【在 g*****g 的大作中提到】
: 如果返回null,那就是你创建的放进去了,当然返回instance,
: 否则你的就没放进去,返回的是map里面的,所以返回temp.

avatar
l*k
13
老大你取笑我了~
谈不上灵感,就是这类小说看多了,觉得现在没啥可看的,不如自己写吧~
但是又有点死心眼,不想随便糊弄,编故事尽量往圆里头编~~所以比较费事。。。
红毛赖歹这个东西在我老家确实是有流传的,我小时候听一个堂哥吓唬我们时候讲的
而且这红毛赖歹真跑到村里叼走过小孩子
至于红毛赖歹敲门这个算是附会以前看过的一个别人的经历,又自己润色了一下
实际上东北有些地区流传着有关于狼趴门伺机吃人的故事,但是狼敲门和狼吐人言算是
我自己创作出来的
新故事里,大帅府三十六友我还真不是瞎胡编的,有名有姓的就不下十个了。这个在即
将推出十八章里也会有交代。
总之,这是一个瞎编的很大的故事,但是很多实际的历史进程和历史人物又都会附会到
里面去。敬请期待:)))))

【在 r******y 的大作中提到】
: 大神你灵感来自哪里,有空写个创作花絮说说是如何构思的吧~~~~
avatar
m*t
14
Will somebody please enlighten me how this code isn't broken in this
situation:
1. Thread A executes the instance assignment in the if block, and gets
scheduled away,
2. Thread B comes in, executes the first instance assignment in the method
with a different i, and gets scheduled away,
3. Thread A comes back and... puts the instance retrieved by B into the map
under its own i?
I don't think volatile gets you _that_ far, and if you are going to tell me
B can't call get because A still has the loc
avatar
l*k
15
【 以下文字转载自 LeisureTime 讨论区 】
发信人: leewalk (腰缠十五贯,骑鹤上扬州。), 信区: LeisureTime
标 题: 明安岭 第十七章 范老铲
发信站: BBS 未名空间站 (Sat Aug 24 01:08:47 2013, 美东)
第十七章《范老铲》
×××××××××××××××××××××××××××××××××
通常越不了解的人和事才越显得神秘。
在李二蛋几个孩子的眼里,吴神仙、邱瞎子、丁阎王和崔寡妇就如同西游记里的神
仙妖怪,在想象里头法力无边。而招娣的姥爷放羊的老范头几乎天天在营子里能看到,
倒让他们觉得不以为然。而且说起来老范头的故事和神仙、鬼怪、赖歹、熊瞎子什么的
都不沾边儿,所以在几个孩子的眼里这这老范头跟营子里的其他老头儿比也看不出什么
特殊的地方来。
高景瑞对自己这个老丈人很多时候也不了解。只是从自己媳妇儿嘴里听说老范头从
小就开始要饭,一直从辽东的旅顺要到沈阳,那年头叫奉天,跟着从奉天要到了辽西。
又从辽西往西走,不知怎么的有一年要饭就要到了南水泉营子,那年老范头才二十出头
的样子,一大早晨就昏倒在了村里的范秀才家门口,被范秀才给救了,等把老范头抬屋
子里头给救醒了之后,老范头倒地下就磕头,连呼“救命恩人,救命恩人,大恩大德,
永世不忘。”正赶着范秀才膝下无子,只有一个老闺女,就这么的就认了个干儿子,老
范头就被范秀才收留了,呆了两年之后范秀才觉得老范头是个老实人就把女儿也许给他
了,算是续下了范秀才家的香火。只是这老范家在这营子里却一直是小门小户。到了老
范头这一代还是没有儿子,生了四个闺女,倒是嫁的都不错。
这老范头其实在三十多年前明安县号召开挖明安水库的时候才在这明安岭下成了名
的,他不光有一套又快又巧的挖土石方的本事,听人说还有看山势起伏走向来找地下水
流的经验,最厉害的是他有一对顺风耳,据说贴到地上能听出十里地外的是骡子是马还
是驴的蹬地声儿,有传的更邪乎的说是听着声儿能说出公母儿来。
按齐家沟老邱瞎子的说法,老范头的本事之一古书上叫作“观山定水,伏地听针。
”说的就是他能通过观察地上的地势判断出地下的水流,再通过自己一对顺风耳能听出
地下水水流的走向和水位的高低。就是隔着墙掉地上一根针,他只要墙那头伏在地上一
听都能听出来。
老范头还有另一个本事是这明安岭下的乡亲们叫出来。唤作“一锨指井,三锨泉涌
。”说的是他只要在地上挖一铁锨土就能知道这个地方能不能打井,打井要打多深的井
。最多挖三铁锨,就能在地上挖出水来。这个“一锨指井”的能耐营子里好多人都见识
过。这“三锨泉涌”却是说有一回西沟的老王家打井,也没找老范头就在自家院子里头
挖井,结果挖了得有两丈多深,还是不见水。老王家一着急没办法就把老范头请了过去
,结果老范头下到坑里,趴在坑底听了听,抄起他自己的独门范家铁锨,不多不少,就
三铁锨,水就噌噌地往外汩。打那之后,周围营子谁家里挖井最后都要找到老范头儿来
挖最后的几锨,久而久之,这“三锨泉涌”就传了开去。
×××××××××××××××××××××××××××××××××
说起老范头的独门范家铁锨,那就得从那年修明安水库说起来。那时候各营子都得
出青壮劳动力参与水库建设,南水泉营子前后去了三四十口子,十个人一组,就是挖土
石方,上头每天派下来的任务,别的组都得连夜赶工才能完成。说也奇怪,就南水泉营
子老范头那一组例外,一帮人看着比别人轻快不少,也没夜里开过工,结果总能按时超
额完成任务。有人就开始瞎传说老范头会搬山卸岭的法术,天天晚上只要一烧个符儿,
就有那成群的仓粮鼠给他运土。谣言传的越来越邪乎最后都传到了工程总指挥刘工的耳
朵里。这刘工是坚决不信的,找个时间就专门看着老范头那一组干活,愣是放下手头的
那么多事儿连着盯着老范头干了三天。最后,这刘工一拍大腿,就冲老范头伸了个大拇
哥,连连说道:“人才!人才!人才啊!神铲啊!你这搬山卸岭的本事还真是不一般咧
!上报县委!全县!不!我看啊!可以考虑全省!全国!”
原来,这刘工仔细考察了之后,发现了老范头这一组挖土石方比别人快的秘密。首
先,这一组细化的分工明确,挖土石是一个小组,运土是一个小组,三个人力独轮车从
来就没有闲置的时间,总是在运土的路上。不像别的组,三个车先全都装满了再一起运
。其次,挖土和运土的人员总能互相轮换,挖土的两个人活儿累,运土的一个人活儿轻
快,三个人一组总能轮换着休息。到最后这十个人还能闲出一个来,照应着三个小组。
最后,这老范头在他们组的铁锨上动了点手脚,虽说也是普通铁锨,可跟普通铁锨比,
铁锨头中间往里凹,两边往里卷刃,而且两三天就磨一磨铁锨头,插铁锨把子的那个铁
圈子又缩了那么一下,所以铁锨把子探不到最里面,外头看着却比别人的铁锨长了那么
一手指头。虽说是普通铁锨改造的,可是老范头这铁锨铲土省劲儿,撬土不费力,带出
来的土还多。跟他们一比,其他组虽说也都是附近营子的青壮劳动力,可就是怎么拼命
干也干不完。
这刘工总结了老范头这组干活的经验之后,马上在所有小组里头,又特意找到几个
做过铁匠活的按照老范头的铁锨把工地的铁锨都改良了一遍,结果,挖土石方的工程比
计划还提前了十天完成,真正做到了“多、快、好、省建设社会主义”。为这,刘工得
到了地委的点名表扬,连老范头都跟着到邻近好几个县里头做工作报告。经过刘工这么
一宣传,这老范头就在明安岭下得了个“范老铲儿”的外号。
×××××××××××××××××××××××××××××××××
这一晚高景瑞领着徐二爷和冉九爷顺着营子里头的小道拐了两个弯就到了自己老丈
人范老铲儿的家门口。到了门口刚想敲门,却被两个老头儿给劝住了。高景瑞也是识趣
的人,于是也就客气了几句自顾自的回刘卫东家招呼着给三个老头子做菜、送菜的事情
。就在回刘卫东家的路上,却迎面碰到了招娣领着盼睇和二蛋一行五个孩子。
“丫头,你干啥去?”高景瑞好奇地问自己大女儿道。
“爹!我们去照应照应姥爷那边,等我三婶子那边做好菜端过来,也得有个人跑前
跑后的支应着点不?”招娣一脸认真地回答。
“恩。”
高景瑞沉吟了一会儿觉得说的很有道理,可又觉得哪里不对劲儿。也来不及深究,
跟着迈步就走了。边走边说道:“恩,丫头懂事啦。好好照顾姥爷啊。别忘了等姥爷他
们吃完了再上桌子。给我把狗剩子看住了。”一边心里想着这三个老头凑一块有什么事
儿之后还能跟招娣嘴里打听出来。
“知道啦!爹!”招娣边应着边领着几个人往老范头家奔去。
等到招娣和二蛋几个赶到了老范头儿家的大门口,就看徐二爷和冉九爷站在门外,
听动静老范头就站在门里。就听徐二爷顶着个罗锅子却使劲地支着头冲着门里喊话道:
“老合字儿,并肩子儿,上马送你一锭金,下马送你一锭银。大碗儿的喝烧酒,大块儿
的吃肥肉。要风得风,要雨得雨啊。”
门里的老范头却大声问道:“酒是什么酒?”
“张家的小烧锅啊!”徐二爷乐呵呵地喊道。
跟着两个人一个门里一个门外就像对暗号一般,一唱一和。
“肉是什么肉?”
“城东!城东啊!曹家的叫驴肉!”
“风叫啥风啊?雨又叫啥雨啊?”
“嘿嘿!嘿嘿!风就那老北风呗,咱家雨帅说啥雨就啥雨啊!”
“四公子里头有哪一位?”
“黄家的黄铁梅!”
“出门带没带手枪队?”
“不带?不带咱咋能叫草上飞。”
“大掌柜是不是海里蹦?”
“嘿嘿,咱家原是北邙山头的穿山甲。”
“好!好!好!一起拜完了三江好!”
“三十六弟兄上阵就是一窝蜂啊!”
说到这里,嘎然而止。只听得门里头的老范头儿几声长叹,喃喃语道“唉……徐罗
锅子,徐罗锅子,你还活着……我以为你早都死了呢。唉……”
而门外的徐二爷却是把头努力地支起来更高,望着夜空,仰天长啸了几声,声音里
却满是悲凉地说道:“当年奉天第一楼的三十六友,还活着的现在五个手指头都能掰过
来了。没想到啊,没想到,打从大帅被日本人炸死那年算,咱三十六友各奔东西,死的
死,亡的亡,这五十几年了,还能在这山沟子里头碰上你。说啥呀?啥都想说,啥都不
想说啊。”
跟着就是很长时间的沉默,冉九爷也愣在那里不知该说些什么。几个孩子更是大气
也不敢喘一声。此时时间仿似地上的雪,在这个腊月里头清冷的夜里也被冻得凝固了一
般。
×××××××××××××××××××××××××××××××××
avatar
g*e
16
你说的是好虫的还是我的,我写的那个锁了instanceMap,没这个问题吧。但是我想了
一下,头两行可能就有问题
instance = instanceMap.get(i);
if (instance == null) {
有可能Thread A取i, Thread B取j,假设A先进去创建了instance,这时候B才检查
instance == null,会直接返回A创建的instance吧。
解决的办法是不是加一个判断?
if (instance == null || instance.getI() != i) {
...
}

map
me

【在 m******t 的大作中提到】
: Will somebody please enlighten me how this code isn't broken in this
: situation:
: 1. Thread A executes the instance assignment in the if block, and gets
: scheduled away,
: 2. Thread B comes in, executes the first instance assignment in the method
: with a different i, and gets scheduled away,
: 3. Thread A comes back and... puts the instance retrieved by B into the map
: under its own i?
: I don't think volatile gets you _that_ far, and if you are going to tell me
: B can't call get because A still has the loc

avatar
s*e
17
沙发,爆米花。
avatar
s*n
18
static public class SpecialSingleton
{
private static Map instanceMap
= new HashMap();
private final int i;
private SpecialSingleton(int i)
{
this.i = i;
}
synchronized public static SpecialSingleton getInstance(int i)
{
SpecialSingleton instance = instanceMap.get(i);
if (instance == null)
instanceMap.put(i, instance
avatar
l*k
19
范老铲的盗墓故事蓄力待发:)

【在 s*******e 的大作中提到】
: 沙发,爆米花。
avatar
g*e
20
这样写当然没问题,面试的人要求high performance

【在 s******n 的大作中提到】
: static public class SpecialSingleton
: {
: private static Map instanceMap
: = new HashMap();
: private final int i;
: private SpecialSingleton(int i)
: {
: this.i = i;
: }
: synchronized public static SpecialSingleton getInstance(int i)

avatar
s*e
21
有大帅撑腰那算是官盗了吧

【在 l*****k 的大作中提到】
: 范老铲的盗墓故事蓄力待发:)
avatar
g*e
22
加判断也不行呀,有可能在return之前instance就被改变了...

method
ConcurrentHashMap

【在 g**e 的大作中提到】
: 你说的是好虫的还是我的,我写的那个锁了instanceMap,没这个问题吧。但是我想了
: 一下,头两行可能就有问题
: instance = instanceMap.get(i);
: if (instance == null) {
: 有可能Thread A取i, Thread B取j,假设A先进去创建了instance,这时候B才检查
: instance == null,会直接返回A创建的instance吧。
: 解决的办法是不是加一个判断?
: if (instance == null || instance.getI() != i) {
: ...
: }

avatar
r*y
23
大神你灵感来自哪里,有空写个创作花絮说说是如何构思的吧~~~~

【在 l*****k 的大作中提到】
: 范老铲的盗墓故事蓄力待发:)
avatar
m*t
24
I was talking about the original code you posted. The race condition that I
think
exists is about instance. Synchronizing on instanceMap wouldn't help.

【在 g**e 的大作中提到】
: 你说的是好虫的还是我的,我写的那个锁了instanceMap,没这个问题吧。但是我想了
: 一下,头两行可能就有问题
: instance = instanceMap.get(i);
: if (instance == null) {
: 有可能Thread A取i, Thread B取j,假设A先进去创建了instance,这时候B才检查
: instance == null,会直接返回A创建的instance吧。
: 解决的办法是不是加一个判断?
: if (instance == null || instance.getI() != i) {
: ...
: }

avatar
l*k
25
哈哈哈哈哈哈,先卖个关子,至于大帅为啥要找“吃臭的”高人
下一章就有交代,这个桥我还真是想了很长时间才想出来的~~~HOHOHOHO

【在 s*******e 的大作中提到】
: 有大帅撑腰那算是官盗了吧
avatar
m*t
26
Yes, there is a race condition here as well. I like shuiguan's version
better -
nothing fancy but easy to verify.

【在 g**e 的大作中提到】
: 你说的是好虫的还是我的,我写的那个锁了instanceMap,没这个问题吧。但是我想了
: 一下,头两行可能就有问题
: instance = instanceMap.get(i);
: if (instance == null) {
: 有可能Thread A取i, Thread B取j,假设A先进去创建了instance,这时候B才检查
: instance == null,会直接返回A创建的instance吧。
: 解决的办法是不是加一个判断?
: if (instance == null || instance.getI() != i) {
: ...
: }

avatar
l*k
27
老大你取笑我了~
谈不上灵感,就是这类小说看多了,觉得现在没啥可看的,不如自己写吧~
但是又有点死心眼,不想随便糊弄,编故事尽量往圆里头编~~所以比较费事。。。
红毛赖歹这个东西在我老家确实是有流传的,我小时候听一个堂哥吓唬我们时候讲的
而且这红毛赖歹真跑到村里叼走过小孩子
至于红毛赖歹敲门这个算是附会以前看过的一个别人的经历,又自己润色了一下
实际上东北有些地区流传着有关于狼趴门伺机吃人的故事,但是狼敲门和狼吐人言算是
我自己创作出来的
新故事里,大帅府三十六友我还真不是瞎胡编的,有名有姓的就不下十个了。这个在即
将推出十八章里也会有交代。
总之,这是一个瞎编的很大的故事,但是很多实际的历史进程和历史人物又都会附会到
里面去。敬请期待:)))))

【在 r******y 的大作中提到】
: 大神你灵感来自哪里,有空写个创作花絮说说是如何构思的吧~~~~
avatar
g*e
28
明白了,这个instance在好几个地方都有可能改变,第一个if那里,put那里,还有最
后return之前
大牛你有没有不用synchronized getInstance的方法?

I

【在 m******t 的大作中提到】
: I was talking about the original code you posted. The race condition that I
: think
: exists is about instance. Synchronizing on instanceMap wouldn't help.

avatar
s*n
29
哈哈,老范头底故事赞啊,私以为(身世之精彩)超过催寡妇```偶像弟弟厉害!
专门研究过铲子咩?擦汗,,,好东西都是辛苦出来底,加油!
“北邙山头的穿山甲。”LOL,好萌,偶像弟弟费工夫了,,,哈哈,还木发财,目前
只能请你吃饭支持了```"说到这里,嘎然而止。只听得门里头的老范头儿几声长叹,"
赞,,,偶像弟弟文章有张力咯,处理这种场景真是美人倚修竹,宝剑啸长虹,趁啊趁
啊。。。不过。。。
一点个人趣味意见:
范老头话“我以为你早都死了呢。唉……”到这里足矣。类似,下面徐二爷“。。。说
啥呀?”即可,或者“说啥呀”重复两次。ps,二爷那个“...还活着...”我也觉得累
赘和不符合场景,但是看在介绍推动情节面上,忍了。
最后一段,“跟着就是很长时间的沉默,冉九爷也愣在那里不知该说些什么。几个孩子
更是大气
也不敢喘一声。此时时间仿似地上的雪,在这个腊月里头清冷的夜里也被冻得凝固了一
般。”手痒想改:“冉九爷也愣在那里不知该说些什么,几个孩子更是大气
也不敢喘一声。时间仿似地上的雪,在冷清底腊月夜里冻得雪白。”

【在 l*****k 的大作中提到】
: 老大你取笑我了~
: 谈不上灵感,就是这类小说看多了,觉得现在没啥可看的,不如自己写吧~
: 但是又有点死心眼,不想随便糊弄,编故事尽量往圆里头编~~所以比较费事。。。
: 红毛赖歹这个东西在我老家确实是有流传的,我小时候听一个堂哥吓唬我们时候讲的
: 而且这红毛赖歹真跑到村里叼走过小孩子
: 至于红毛赖歹敲门这个算是附会以前看过的一个别人的经历,又自己润色了一下
: 实际上东北有些地区流传着有关于狼趴门伺机吃人的故事,但是狼敲门和狼吐人言算是
: 我自己创作出来的
: 新故事里,大帅府三十六友我还真不是瞎胡编的,有名有姓的就不下十个了。这个在即
: 将推出十八章里也会有交代。

avatar
g*e
30
这个据说是google的面试题,面试的哥们给了shiguan的方法,但是人家要高性能的

【在 m******t 的大作中提到】
: Yes, there is a race condition here as well. I like shuiguan's version
: better -
: nothing fancy but easy to verify.

avatar
s*n
31
倒```狼敲门狼吐人言都编底很不错很不错

【在 l*****k 的大作中提到】
: 老大你取笑我了~
: 谈不上灵感,就是这类小说看多了,觉得现在没啥可看的,不如自己写吧~
: 但是又有点死心眼,不想随便糊弄,编故事尽量往圆里头编~~所以比较费事。。。
: 红毛赖歹这个东西在我老家确实是有流传的,我小时候听一个堂哥吓唬我们时候讲的
: 而且这红毛赖歹真跑到村里叼走过小孩子
: 至于红毛赖歹敲门这个算是附会以前看过的一个别人的经历,又自己润色了一下
: 实际上东北有些地区流传着有关于狼趴门伺机吃人的故事,但是狼敲门和狼吐人言算是
: 我自己创作出来的
: 新故事里,大帅府三十六友我还真不是瞎胡编的,有名有姓的就不下十个了。这个在即
: 将推出十八章里也会有交代。

avatar
m*t
32

I'm honestly too old for this sh*t. :) Not worth killing brain cells
_and_ the embarrassment if whatever clever scheme I come up
with turns out wrong.

【在 g**e 的大作中提到】
: 明白了,这个instance在好几个地方都有可能改变,第一个if那里,put那里,还有最
: 后return之前
: 大牛你有没有不用synchronized getInstance的方法?
:
: I

avatar
g*e
33
哈哈,你说的对

【在 m******t 的大作中提到】
:
: I'm honestly too old for this sh*t. :) Not worth killing brain cells
: _and_ the embarrassment if whatever clever scheme I come up
: with turns out wrong.

avatar
g*g
34
You are right, but the instance variable itself
is totally unnecessary. Using a local variable there
the code should be fine.

map
me

【在 m******t 的大作中提到】
: Will somebody please enlighten me how this code isn't broken in this
: situation:
: 1. Thread A executes the instance assignment in the if block, and gets
: scheduled away,
: 2. Thread B comes in, executes the first instance assignment in the method
: with a different i, and gets scheduled away,
: 3. Thread A comes back and... puts the instance retrieved by B into the map
: under its own i?
: I don't think volatile gets you _that_ far, and if you are going to tell me
: B can't call get because A still has the loc

avatar
m*t
35

I could be wrong but I don't think local variables can be volatile, which
would make
the double check locking part seem a little shaky...

【在 g*****g 的大作中提到】
: You are right, but the instance variable itself
: is totally unnecessary. Using a local variable there
: the code should be fine.
:
: map
: me

avatar
g*g
36
I could be wrong but I think it will work.
The reason double check locking has potential issue was due to the
fact that initialization and assignment is not necessarily in the
right order. So if you invoke the get functions on the object for
example, you can see the default 0, null and false there instead
of the right initialized values.
However, with a map, you explicitly initialize first, then
assign second (by putting it into the map). So when you are in
the sync block, the entry is either cr

【在 m******t 的大作中提到】
:
: I could be wrong but I don't think local variables can be volatile, which
: would make
: the double check locking part seem a little shaky...

avatar
g*e
37
这样?
if (instanceMap.get(i) == null) {
synchronized (instanceMap){
if (instanceMap.get(i) == null) {
instanceMap.put(i, new
SpecialSingleton(i));
}
}
}
return instanceMap.get(i);
或者您老写的这样?
if (instanceMap.get(i) == null) {
instanceMap.putIfAbsent(i, new Specia

【在 g*****g 的大作中提到】
: I could be wrong but I think it will work.
: The reason double check locking has potential issue was due to the
: fact that initialization and assignment is not necessarily in the
: right order. So if you invoke the get functions on the object for
: example, you can see the default 0, null and false there instead
: of the right initialized values.
: However, with a map, you explicitly initialize first, then
: assign second (by putting it into the map). So when you are in
: the sync block, the entry is either cr

avatar
m*h
38
have you considered
public enum MySingleton{
INSTANCE;
....
}
Must be JDK 1.5 or above.
Not sure how the instance-map is handled here.
avatar
c*t
39
Two issues.
1. As magicfat has pointed out, you have a race condition. Normally,
you need to check-and-check-again to verify the value. That is:
instance = map.get (i);
if (instance == null)
{
synchronized (...)
{
instance = map.get (i); // very important!
if (instance == null)
{
// instantiation
}
}
}
2. Note that, synchronized map itself requires locking! This is a major
issue. This is oxymoron because you wasted a lot of code and essentially
still

【在 g**e 的大作中提到】
: Write a special singleton class, the class has one integer field, make sure
: only one instance of this class will be instantiated for the same value of
: the integer field.
: jobhunting版有人给了个代码,我改了一下,高手看看对不对,谢谢. 用了double
: lock checking
: public class SpecialSingleton {
: private final int i;
: private volatile static SpecialSingleton instance = null;
: private static ConcurrentHashMap
: instanceMap = new ConcurrentHashMap();

avatar
s*n
40
the ConcurrentHashMap can be used for lockless lookup, without copying.
however, I bet the naive version I provided outperforms the sophisticated/
optimized ones on the commodity machines google uses.
avatar
s*g
41
mark

sure

【在 g**e 的大作中提到】
: Write a special singleton class, the class has one integer field, make sure
: only one instance of this class will be instantiated for the same value of
: the integer field.
: jobhunting版有人给了个代码,我改了一下,高手看看对不对,谢谢. 用了double
: lock checking
: public class SpecialSingleton {
: private final int i;
: private volatile static SpecialSingleton instance = null;
: private static ConcurrentHashMap
: instanceMap = new ConcurrentHashMap();

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。