【问题标题】:Static method calling another Static method with Object reference as parameter :Is It Thread Safe?静态方法以对象引用作为参数调用另一个静态方法:线程安全吗?
【发布时间】:2013-07-26 12:06:34
【问题描述】:

我有静态方法,它在自身内部调用另一个静态方法。

例如:

public List<Object> static first(int id){

       List<Object> list=new ArrayList<Object>();
       list.add(a);
       list.add(b);
       list.add(c);

       //calling another static method   
       second(id,list);

       return list;

}

public String static second(int id,List<Object> listRef){

       listRef.add(a);
       listRef.add(b);
       listRef.add(c);


}

我的问题是:

多个线程正在使用不同的 id 调用 public static method first(int id);

这是否是线程安全的方式?因为我在方法中声明 arrayList 并且我认为它的引用可能被其他线程共享。

问题是 Array 存储在堆内存中而不是存储在 Individual 中 线程堆栈。所以我认为许多线程共享数组引用 可能会发生。

【问题讨论】:

    标签: java thread-safety


    【解决方案1】:

    是的,它是线程安全的。你的 ArrayList 是一个局部变量,不被线程共享(除非你明确地做了一些事情来共享它)。

    在这种情况下,每个线程都会有自己的 ArrayList。

    【讨论】:

    • 由于arraylist存储在堆内存上而不是每个线程单独的堆栈上,所以我担心可能会发生共享?
    • @HarshadDeshmukh 我不明白你的反对意见。 ArrayList 存储在堆上而不是堆栈上有什么关系?它们仍然引用不同的ArrayLists,因为它们来自方法的不同调用。所以,不会有分享...
    • @HarshadDeshmukh 不可能发生“意外共享”。是的,数组列表存储在堆中(所有对象都是如此),但对数组列表的引用存储在堆栈中。
    【解决方案2】:

    每个thread 都有自己的method 副本。静态方法只是属于Class而不是对象的方法。只要您不操作任何shared variablesresources,它就是线程安全的。

    【讨论】:

    • 是的,你是对的,但是在该方法中声明的对象存储在堆中而不是堆栈中,因为它的(堆栈)大小是固定的
    • 局部变量与堆和栈没有直接关系。本地 int 将存储在堆栈上,而本地对象将存储在堆上,其引用在堆栈上。
    • 好的,我明白了,谢谢! :)
    【解决方案3】:

    只要您不直接从每个线程调用second,它就是线程安全的。为此,您应该考虑将 second 设为私有方法。

    【讨论】:

      【解决方案4】:

      a、b 和 c 是什么类型的对象?由于这只是将内容添加到列表中,然后调用另一个静态方法,因此我没有看到任何问题

      所以是的,它的线程安全..

      【讨论】:

        猜你喜欢
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 2022-11-18
        • 2013-06-19
        相关资源
        最近更新 更多