今天在准备分享内存可见性问题时的keynote时写了一个demo程序,却产生了很多启发性的问题。先来看看程序
这个程序的逻辑很简单,就是50个线程做累加,然后算个总数。主线程自旋等待所有子线程结束。但这个程序在我的 电脑上是停不下来的,但在其它同事的电脑上却能停的下来。我的第一反应是,AddThread的finish变量不是volatile的,是不是因为这个可见性问题导致程序停不下来呢?果然,把finish改成volatile程序停下来了,这是大家都知道的知识,volatile在不同的vm上和不同的cpu上表现是不一样的。
但是实验没有停止,我把add前面的synchronized去掉了,程序奇迹般的停下来了,虽然最后结果不对(缺乏正确同步),这又是为什么呢?仔细想来可能是不加synchronized执行的快一些把,可能主线程进while循环的时候,子线程都已经搞完了。这时候去加载finish变量的时候,由于是第一次读取,肯定要去主存读得。。所以应该能拿到正确的值。为了验证这个结果,去掉synchronize,在addThread里面加入一个sleep,让它跑得慢一点。sleep(1),停下了。。sleep(10),停下了。。sleep(100),程序奇迹般的停不下了。所以这个推测是正确的。也就是说如果进了while循环,子线程都跑完了,程序是能正常结束的。但是子线程没跑完,就结束不了了。合理的解释是第一次读取变量和刷新变量的逻辑还是不一样的
另外还有种让程序停止的方法,就是在else里面让cpu稍微干点活。这个活,必须是费cache的。复杂的运算不行,必须要让cpu的cache失效。可以是一个io操作,如System.out.println (因为这时候cpu会从us状态切换到sy状态,从而让缓存失效)。或者分配一个大数组。我尝试分配了一个长度为1000的数组,程序没有停下,但分配10000,程序停下了。。也就是说我cpu的每个核心自由的cache,应该也就是在几k这个数量级了。。这时候cpu cache失效,会重新加载finish变量。。程序就停下了
最后有一点,count.get()程序能正常结束的情况下,总是能正确输出5000000,我的猜想是,程序读到了finish的值,应该也能读到int的值了。只要让缓存失效,重新加载finish,那么int字段应该也是重新加载的了。所以就算没有用显示的同步,依然可以拿到正确的结果
相关推荐
一段程序,是SETP7的,FC115模块是关于变频器启停的.zip西门子PLC编程实例程序源码下载一段程序,是SETP7的,FC115模块是关于变频器启停的.zip西门子PLC编程实例程序源码下载一段程序,是SETP7的,FC115模块是关于...
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2 分别向管道各写一句话: Child1 is sending a message! Child2 is sending a message! 而父进程则从管道中读出来自于...
在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。我们所做的第一项工作就是设立断点;其次再运行程序;当程序在设立断点处停下来时,利用各种工具观察程序的状态。 程序在断点停下来后,有时...
JAVA一段生成验证码图片的程序 JAVA一段生成验证码图片的程序 JAVA一段生成验证码图片的程序 JAVA一段生成验证码图片的程序
单按钮启停控制,三菱FX2N系列PLC程序范例。
西门子PLC例程源码一段程序,是SETP7的,FC115模块是关于变频器启停的本资源系百度网盘分享地址
西门子PLC例程-一段程序,是SETP7的,FC115模块是关于变频器启停的
工业机器人-一段程序,是SETP7的,FC115模块是关于变频器启停的.7z
西门子plc单键控制启停程序.doc
完整的以太网帧解析程序,使用C++完成,可直接运行,内含程序源码与说明文档。
自定义每隔一段时间自动按下空格键,当然你可根据代码改变你要按的键。
将相应的代码复制下来保存为1.txt,保存到D盘 运行你的cmd 输入D: 输入debug 将看到效果,一个3d房子,一段音乐 退出按,Esc键,在cmd下输入exit
使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道各写一句话: Message from Child l! Message from Child 2! 父进程从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子...
这是我为自己写的一款表白的程序,并且己用它表白成功,于是几经努力把它完成为一个完整的程序,这是我准备完成的程序之爱系列第一辑,希望能多做几辑吧。
主要是实现输煤皮带的顺煤流停车,逆煤流启动。 不知道对大家有没有用,先传上去,与大家共享。
西门子PLC程序
go语言实现可配置的程序启停,可以配置依赖,配置检查 支持linux和windows
程序读取一个英文文本文件,使用者输入一个英文单词,它就会统计该英文单词在这段英文中出现的次数及出现的位置。