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

2020 年 5 月 29 日
 zhout
public class Demo {

  Map<Object,Object> map;

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

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

https://study.congcong.us/t/676763

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

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

© 2021 V2EX