[提问] 声明一个成员变量,在局部方法中初始化,是否有线程安全问题?

2020-05-29 16:48:35 +08:00
 zhout
public class Demo {

  Map<Object,Object> map;

  public void foo(){
    map = new HashMap<>();
  }
}
2484 次点击
所在节点    Java
15 条回复
zhout
2020-05-29 16:58:59 +08:00
额,补充一下,单机多线程的环境下。
zsl199512101234
2020-05-29 17:00:35 +08:00
为啥要这样做呢
duwan
2020-05-29 17:01:10 +08:00
跟在哪初始化有什么关系?又不是局部变量
Jacky23333
2020-05-29 17:02:20 +08:00
不是很明白你的目的是什么,是要实现单例模式吗?如果是的话那当然是线程不安全的,你需要考虑多个线程同时调用这个方法会怎样
ho121
2020-05-29 17:02:51 +08:00
有,如果 foo 被多个线程调用的话
duwan
2020-05-29 17:04:45 +08:00
建议楼主再看看 JVM 内存模型。如果是局部变量会在栈里,没有线程问题。但是你这个 map 是在堆里面,多线程会有问题的
resist
2020-05-29 17:06:42 +08:00
大胆写,哪有那么多线程
0x1001
2020-05-29 17:10:26 +08:00
@duwan 正解
zhout
2020-05-29 17:18:47 +08:00
@duwan 疑惑是每次 new HashMap,重置了一下,还有安全问题嘛
zhout
2020-05-29 17:19:53 +08:00
@zsl199512101234 看到同事代码里有这种骚操作,,,我正好也不太懂,所以发帖问问
zhout
2020-05-29 17:20:17 +08:00
@Jacky23333 看到同事代码里有这种骚操作。。
ChanKc
2020-05-29 17:24:45 +08:00
TheCure
2020-05-29 17:55:55 +08:00
you
yeqizhang
2020-05-29 18:02:21 +08:00
有线程安全问题,但不能说代码一定有问题,只是不好。你得看看实际使用情况,比如假如这是个单例 springmvc controller 那肯定不行,比如后续继续要使用 map 赋值,另外一个线程又把它变成 new Map
zhout
2020-06-01 10:59:25 +08:00
@yeqizhang 赞,这个回答很完美

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/676763

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX