【问题标题】:Which variables are thread safe?哪些变量是线程安全的?
【发布时间】:2014-06-05 06:22:05
【问题描述】:

我有一个 Servlet A,它在其方法之一中定义了一个局部变量 a1,如下所示。还有另一个类 B,在 Servlet A 中为其创建对象,该对象调用该方法并执行操作。

a1a2 变量中的哪一个是线程安全的,为什么?我相信a1 是线程安全的,因为它是A 类的本地对象,而a2 不是线程安全的,因为它表现为成员变量。

class Servlet A {    
    public void method1(){
        String a1;    
        B b = new b();
        String c = b.method2(a1);    
    }  
}

class B {
    String a2;
    public String method2(String a1){
        // do operations on a1 and a2 
        return a1+a2;
    }
}

【问题讨论】:

    标签: java multithreading variables thread-safety scope


    【解决方案1】:

    你是对的。方法范围的变量(局部变量)是线程安全的,因为它们存在于堆栈中并且不能被其他线程访问。

    成员变量(字段)存在于堆中并且不是线程安全的,因为它们可以被多个线程同时访问。

    【讨论】:

    • @Thanks Denis...所以你能确认在我的情况下 a1 是线程安全的,而 a2 不是吗?
    • 这里的a1是局部变量还是成员变量?因为我在另一个 B 类中使用 a1,所以它会被视为成员变量吗?
    • 不,不会。 a1 是 A::method1 的局部变量。 a1 是 B::method2 的局部变量。但这是两个完全不同的变量,每个变量都有自己的方法。当您调用 b.method2(a1) 时,局部变量 A::method1::a1 被复制(不完全是,但将其视为复制)到局部变量 B::method2::a1。
    • 谢谢丹尼斯..你说得很清楚..谢谢...最后一个问题。如您所知,到目前为止 a2 是在 B 类的方法之外定义的,所以我认为到目前为止它不是线程安全的?我在 method2 中声明 a2 是什么,它还会被视为成员变量吗?或者它会被视为局部变量并成为线程安全的?
    • 如果你在 method2 中声明它,它将成为本地的,因此是线程安全的,但你只能在 method2 中访问它然后。成员变量可以被多种方法访问,这使得它们对于跨方法保存状态非常有用。
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2011-08-28
    • 2013-04-01
    • 2010-12-20
    • 2023-03-22
    • 2011-01-11
    • 2012-04-18
    • 2017-09-13
    相关资源
    最近更新 更多