Java多线程中同步Boolean问题
2015-12-27 15:06
302 查看
最近在使用netty写个小玩意儿,其中在通信时,Server给Client的响应中,要包含一组信息,直到Client成功收到并解析。
这需要有一个Flag,一开始我使用Boolean, 变量名receivedPeerList,以构造函数参数的形式传递进channelHandler中,然后在主线程和netty的channelRead事件中同步它。
用法如下:
channelRead中修改它:
主线程中使用它:
刚开始觉得这个很简单,没什么问题。后来测试中出现了莫名其妙的bug。经过调试后,发现,主线程和channelRead中的receivedPeerList不是同一个对象:
上网查资料,发现了一片ITeye的文章不要同步Boolean。看完之后,我理解的就是:编译器会把所有的Boolean变量指向Boolean.TRUE和Boolean.FALSE两个常量,所以这种同步方式是无效的(因为主线程中的receivedPeerList一直指向Boolean.False,而channelRead中一直指向Boolean.True)。
解决方案是使用AtomicBoolean。
这需要有一个Flag,一开始我使用Boolean, 变量名receivedPeerList,以构造函数参数的形式传递进channelHandler中,然后在主线程和netty的channelRead事件中同步它。
用法如下:
channelRead中修改它:
主线程中使用它:
刚开始觉得这个很简单,没什么问题。后来测试中出现了莫名其妙的bug。经过调试后,发现,主线程和channelRead中的receivedPeerList不是同一个对象:
上网查资料,发现了一片ITeye的文章不要同步Boolean。看完之后,我理解的就是:编译器会把所有的Boolean变量指向Boolean.TRUE和Boolean.FALSE两个常量,所以这种同步方式是无效的(因为主线程中的receivedPeerList一直指向Boolean.False,而channelRead中一直指向Boolean.True)。
解决方案是使用AtomicBoolean。
相关文章推荐
- Java中数组赋值的三种方式
- SpringMVC 自定义参数绑定实现日期类型绑定
- 初步封装jdbc
- 字符串转换为合法IP地址
- Java算法---华为oj查找组成一个偶数最接近的两个素数
- Java中的委托模式
- BFPRT 算法java实现
- 在windows环境下,使用Eclipse和gcc-Linaro工具链,对BeagleBone进行交叉编译和远程部署
- 牛客网PAT乙级真题及java实现样例(真题1-14)
- 《Java Web程序开发入门》知识总结(四)
- 二分查找java语言实现
- Struts回顾
- 常用java编译器总结
- java中的静态块
- 从零开始写javaweb框架笔记8-细节完善与代码优化
- 堆排序java代码实现
- java提高篇(二四)-----HashSet
- java提高篇(二三)-----HashMap
- Java实现冒泡排序算法
- java.lang.ExceptionInInitializerError BeanCreationException: Error creating bean with name 'TestServ