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

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]) lo = mid + 1; else return mid; } return -1; } 

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

谢谢!

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

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

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

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

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