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

use*_*866 8 java static-methods thread-safety

   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;
    }
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Dea*_*vey 7

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

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

  • 顺便说一句 - 我认为通过引用传递数组是不对的(但我明白你的意思).更确切地说,数组引用是按值传递的.谢谢! (4认同)