Java数组在静态方法线程中是否安全?

时间:2011-11-04 21:13:45

标签: java thread-safety static-methods

   public static int rank(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1;
        while (lo <= hi) {
            // Key is in a[lo..hi] or not present.
            int mid = lo + (hi - lo) / 2;
            if      (key < a[mid]) hi = mid - 1;
            else if (key > a[mid]) lo = mid + 1;
            else return mid;
        }
        return -1;
    }

上面的静态方法进行二分查找。它是线程安全的吗?我知道局部变量是线程安全的,但“a”这里是一个数组,所以这意味着它是Java中的一个对象,对吧?那是问题吗? 刚刚读取数组,没有以任何方式进行修改,所以我假设这个方法是线程安全的。但我想确保理解为什么。

谢谢!

3 个答案:

答案 0 :(得分:7)

没有数组通常不是线程安全的。代码是否在这种情况下取​​决于其他线程是否可以访问您传入的数组。由于数组是通过引用传递的,因此其他线程可以访问它们。

如果您只在一个线程中创建/修改数组,或者传入一个以线程安全方式复制的副本,那就没问题了。

答案 1 :(得分:1)

该方法本身是线程安全的,因为它只接受它的参数并读取它们,而不将它们发布到任何其他线程。但这并不意味着您不会遇到线程问题。这一切都取决于论据的来源。

如果参数构成线程之间的共享状态,则应以某种方式同步对此状态的每次访问。但是您必须在线程之间建立同步策略以保护对此状态的访问。因此,此方法或此方法的调用方应确保对该状态的访问是线程安全的。在不知道参数来自何处的情况下,因此无法判断此代码​​是否是线程安全的。

答案 2 :(得分:0)

是的,它是线程安全的,因为你说只读数组,唯一可能的麻烦是,如果另一个线程在这个方法读取它的同时更新数组

相关问题