作者dream1124 (全新开始)
看板java
标题[问题] 请问有记忆体不一致的好例子吗?
时间Mon Aug 9 16:53:16 2010
请问一下,有人可以分享多执行绪程式记忆体内容不一致(资料存放位置不同,
造成读取的执行绪未取得最後更新值)的范例吗?
是这样子的
我在撰写一篇有关多执行绪的基础介绍文章给系上学弟妹参考,
里面会提到volatile修饰字。
为了比较经过volatile修饰的效果,希望能找到示范「记忆体内容不一致」的例子,
然後经过Volatile修饰之後得到正确的值。
我了解多执行绪范例程式很难写,因此不会期望能找到100%机会展现这种问题的程式,
但还是希望出现机率可以超过10%,让文章的读者不用重试那麽多次。
除了上面的考虑之外,这个错误示范程式的内容最好不含synchronized修饰字。
原因是synchronized造成的效果太多种,难以让读者厘清问题。
此外还要尽可能不掺入其他类型的执行绪问题,例如Thread Interference,
但如果执行绪问题包含「JVM改变执行顺序」就没有关系,
毕竟这本来就是volatile要阻止的事情之一。
感觉要做到上述这点会比较困难。 Orz
目前看过的网路文章或是实体书中的例子,要不成功率极低,跑不出所以然。
要不就是掺入其他执行绪问题,这样读起来使我有种「他说那程式有问题,就是有问题,
他说了算,拿不出什麽证据」的感觉。
可是自己跳下去撰写例子时,要不就是写出安全的物件,
要不就是写出含有一种以上不安全状况的物件,真是有点伤脑筋
看过较合适的例子也只有这个:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#36930
可惜它的比较结果还是不够明显
请问有任何人可以提供合适的例子吗? 谢谢大家帮忙罗
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.85.162
2F:推 a1e:讯息输出项目就很好看的出来了 08/09 17:36
谢谢您的建议,他写的例子虽然可能有包含记忆体不一致,
但主要问题还是执行绪互相干扰吧(Thread Interference)
这边所谓「记忆体不一致」,指的是各执行绪存放资料位置不同(CPU快取、暂存器、
记忆体)造成修改变数之後,接续着读取的执行绪未能取得最後更新的数值
3F:推 a1e:你这个问题我不行了囧,你这问题太低层了,找版主看看吧囧 08/09 17:56
※ 编辑: dream1124 来自: 61.231.149.120 (08/09 21:16)