首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhout
V2EX  ›  Java

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

  •  
  •   zhout · 38 天前 · 1222 次点击
    这是一个创建于 38 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class Demo {
    
      Map<Object,Object> map;
    
      public void foo(){
        map = new HashMap<>();
      }
    }
    
    15 条回复    2020-06-01 10:59:25 +08:00
    zhout
        1
    zhout   38 天前
    额,补充一下,单机多线程的环境下。
    zsl199512101234
        2
    zsl199512101234   38 天前
    为啥要这样做呢
    duwan
        3
    duwan   38 天前
    跟在哪初始化有什么关系?又不是局部变量
    Jacky23333
        4
    Jacky23333   38 天前 via Android
    不是很明白你的目的是什么,是要实现单例模式吗?如果是的话那当然是线程不安全的,你需要考虑多个线程同时调用这个方法会怎样
    ho121
        5
    ho121   38 天前 via Android
    有,如果 foo 被多个线程调用的话
    duwan
        6
    duwan   38 天前
    建议楼主再看看 JVM 内存模型。如果是局部变量会在栈里,没有线程问题。但是你这个 map 是在堆里面,多线程会有问题的
    resist
        7
    resist   38 天前
    大胆写,哪有那么多线程
    0x1001
        8
    0x1001   38 天前
    @duwan 正解
    zhout
        9
    zhout   38 天前
    @duwan 疑惑是每次 new HashMap,重置了一下,还有安全问题嘛
    zhout
        10
    zhout   38 天前
    @zsl199512101234 看到同事代码里有这种骚操作,,,我正好也不太懂,所以发帖问问
    zhout
        11
    zhout   38 天前
    @Jacky23333 看到同事代码里有这种骚操作。。
    ChanKc
        12
    ChanKc   38 天前 via Android
    callofmx
        13
    callofmx   38 天前
    you
    yeqizhang
        14
    yeqizhang   38 天前 via Android
    有线程安全问题,但不能说代码一定有问题,只是不好。你得看看实际使用情况,比如假如这是个单例 springmvc controller 那肯定不行,比如后续继续要使用 map 赋值,另外一个线程又把它变成 new Map
    zhout
        15
    zhout   35 天前
    @yeqizhang 赞,这个回答很完美
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1309 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:07 · PVG 07:07 · LAX 16:07 · JFK 19:07
    ♥ Do have faith in what you're doing.