【问题标题】:Java servlet method hashmap scopeJava servlet 方法 hashmap 作用域
【发布时间】:2013-06-25 14:25:13
【问题描述】:

Java servlet doGet() 方法在方法内部声明了一个 hashmap。是否需要同步多个请求的线程安全?在方法中使用 new 的本地声明对象的范围是什么?

【问题讨论】:

    标签: java thread-safety hashmap servlet-3.0


    【解决方案1】:

    如果您在谈论局部变量:不,不需要同步。

    servlet 中的单个方法可以由多个线程同时执行,但在该方法中声明的变量不共享。方法的每次调用都有自己的局部变量副本。

    【讨论】:

    • 感谢马特·鲍尔。那么如果从方法中创建 HashMap m = new HashMap() 来做某事会发生什么。需要同步吗?
    • 如果没有更好地解释它是如何共享、传递等的,我无法回答这个问题。我们还在谈论 local 变量吗?代码是否将此对象暴露给多个线程?
    • 抱歉...为简化起见,我们假设 hashmap 是在方法中创建的,并且仅在方法中使用。在这种情况下,它(声明的 hashmap 变量'm')是否必须同步?
    • 没有。这正是我在回答中谈到的情况。每个方法调用的局部变量都特定于该方法调用。这就是局部变量的定义。 docs.oracle.com/javase/tutorial/java/nutsandbolts/…
    • 好的,谢谢。所以我相信,如果它在类内或类外的某个地方使用,以确保线程安全,最好同步它。此外,如果在本地声明,hashmap 是在线程栈帧上可用还是在堆上创建?
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2018-08-25
    • 2014-10-29
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多