多线程访问时,对象的不同创建方式而导致的并发问题?

多线程访问时,对象的三种创建方式导致出现的不一样的并发问题.
第一种方式:

clipboard.png

clipboard.png
第二种方式:

clipboard.png

clipboard.png
第三种方式:

clipboard.png

clipboard.png

第一种方式,我知道是因为resultInfo是成员变量的问题,所以会出现多线程访问的并发问题.
第三种方式,因为resultInfo是局部变量所以没有并发问题.
那第二种方式呢?我在方法中对resultInfo变量重新new了啊,那应该每次访问该方法时resultInfo都是一个新的对象的才对啊,不应该会有并发问题吧??
是不是我哪里理解错了,请教这个问题.

阅读 3.1k
2 个回答

先说点题外话:你的那个@Autowired注解是干嘛用的?为什么这种对象要让Spring来管理呢,我是很不能理解。。。题主能否稍微解释下?

回到正题,题主还是没搞懂Java中的值传递。对于同一个变量resultInfo,

  1. 线程A执行
  2. 线程A中将此全局变量指向新建的对象A
  3. 然后线程B被操作系统调度开始执行,线程B将此变量指向新建的对象B
  4. 线程A重新被调度,你觉得此时变量应该指向对象A还是B?

注意到题主类名上注释掉了的@Scope("prototype"),想必清楚controller是默认单例的了,那么很明显controller的成员变量的引用只可能有一个值。那就正如上面所说,A线程先维护了resultInfo为a,B线程后把resultInfo改成了b,所以A线程再使用成员变量的话就会得到b的引用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题