java字段可见性,volatile的奇妙

本文为原创文章,转载请注明出处,谢谢你……

> 喜欢java并发编程的请加群:736156823

开始-->

很喜欢使用volatile关键字,还没有啥需要特殊关注的,平时用的也很嗨,但是最近通过反射修改了这个字段,发现了一些小问题,描述如下:

1.

初始化由spring管理

这个字段在初始化时候由spring加载时候读取配置文件中的值通过反射设置进来,代码如下:

反射注入

反射替换好后,打印结果:

debug

这时直接打印是没有问题的,与properties文件中的值保持一致,立刻可见。这是由spring启动线程打印的。(代码最好不要挂火车,哈哈……)

2.所有初始化完毕后,会通过信号量的机制,提醒另一个线程打印结果,代码如下:

初始化代码
二值信号量与无用等待

负责打印的另一个线程代码如下:

另一个打印线程
打印信息方法

3.问题来了:

spring线程打印的结果是配置文件的值,但是打印线程的打印结果却是代码中的默认值……怪了……哈哈

下面本人解决办法与问题猜测(很不专业,哈哈……)。

解决:

打印方法上加锁

这个方法简单好用(不好用)。

就刚才,我测试了下,刚开始使用lock还好使的。现在竟然不好使了,哈哈……好奇妙,如下图:

突然lock不好使了

配置文件中配置的值是on,但是使用lock打印的结果却是off……哈哈,奇妙……

再启动的时候先通过spring反射修改掉,在spring中打印config类中的值是on,但是全部启动完后,通过信号量使用打印线程打印出的竟然是off,打印方法是带有lock的,这两部之间没有任何其余修改动作。

更奇妙的又来了,哈哈……

系统中有许多定时任务,任务中需要获得开关的值,但是,这些获取值的动作获取到的值竟然是全部正确的,哈哈……厉害……

定时任务获得正确值

针对以上情况改动如下。

因为定时任务启动有延迟,那么我直接修改延迟时间为0,测试下:

修改后测试结果00
修改后测试结果01

出现两个问题,配置文件中button全部是on,代码中button全部是off,第一个截图中既有on又有off,这个打印实在一个lock中的;第二,在定时器立即启动运行时原来打印为off的全部是on了,而且之后的全部值都是on。

小完结:

1.说下本人对volatile关键字的理解吧,哎……

添加缓存行失效标记……每次读取内存中的值,不使用线程本地缓存……每次修改完成会强制刷新回主存,那么谁来帮助刷新(这是我一直关注的问题)?操作系统总线机制帮忙刷新,至于什么时候刷新,刷新速度,每次刷新允许最小间隔是多少,不得而知,可以参考《计算机组成原理》,不同平台略有区别,况且jvm内存模型是怎么配合操作系统的我也不清楚。所以本人使用时候还没遇到过什么问题,只要知道哪里是关键就好了,其他的不要多想。

这次系统中需要一个功能就是对配置文件的热加载能够及时的反应到定时任务中,并且能够根据变换,立即修改定时间隔,重新启动定时,所以才有上面的问题出现。

2.正因为上面volatile关键字的特点所以才有上述的奇妙,但是本人的系统是异步的,不允许有阻塞或者说长时间阻塞,所以我在这里,仅仅是为了初始化时候打印正常,加了一短促等待:

短促等待

至于对功能上的影响,还是比较少的,毕竟:1.定时延迟大于1秒;2.系统总线刷新缓存很快。所以,没有影响。

3.上述打印的地方仍然是使用lock的,现在不修改了。

4.关于打印方法:

延迟打印

由于打印方法是异步调用,初始化线程是通过信号量触发其他线程打印的,所以都不会有阻塞,都是正常的执行过程,所以暂时都这样来修改了。

5.由于是热加载的,即时生效,所以我刚才修改了下配置文件,然后文件监控器通过信号量唤醒触发,结果如下:

测试热加载

看吧,系统刷新还是很快的,哈哈……

6.所以,这样一来,没有理解volatile的朋友是不是理解了,所以,这个用起来还是不错的,毕竟操作系统还是可以的,哈哈……至于指令重排,对象的完整初始化保证等能力,大家还是自行百度吧

7.哈哈,热加载……好热呀

8.后续跟进seda模型

> 喜欢java并发编程的请加群:736156823

结束-->

本文为原创文章,转载请注明出处,谢谢你……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容