Spring IoC容器和动态代理对volatile变量的影响

栏目:Spring-IoC模块 作者:admin 日期:2018-10-25 评论:0 点击: 562 次

金丝燕网技术交流群的成员【独木桥自横(787619698) 】遇到一个问题,如下所示:

调用一次close方法  为什么run函数里面的active还是true呢?

是在controller调用了logConsumer的close方法,该方法是将active设置为false,但是线程还是true,这个是为什么呢?没想明白。


这个成员打断点的调试过程是这样的:
在close方法中打了断点为false,这个时候while的active为false,但是线程并没有停止 还是继续执行,以后active就一直为true

经过群里大家的讨论,终于将问题解决了,问题的分析如下:
(1)我的观点是:这个问题感觉不是多线程的问题,从多线程角度分析是没有问题的,active就是内存的一个变量,独一无二的变量,怎么改变,它也只有一份。现在没有生效,那也许就是代理方面有问题了。很大可能是spring的问题,运行起来的是代理的类,不是ide里面看到的类
(2)最后,群成员【乌鲁木齐-冰程(982604405) 】给出了最合理的解释:
问题应该出在init方法里面,新建的线程持有的是原始对象,而控制器层是代理对象,同时针对私有属性,是不共享的,也就是说原始对象里的active和代理对象里的active不是同一个。
以后,大家如果遇到spring方面的问题,可以找这两位群成员讨论,QQ已经给出来了,如果遇到多线程的问题,可以找我来讨论。

Spring IoC容器和动态代理对volatile变量的影响:等您坐沙发呢!

发表评论