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中的一个对象,对吧?那是问题吗? 刚刚读取数组,没有以任何方式进行修改,所以我假设这个方法是线程安全的。但我想确保理解为什么。
谢谢!
答案 0 :(得分:7)
没有数组通常不是线程安全的。代码是否在这种情况下取决于其他线程是否可以访问您传入的数组。由于数组是通过引用传递的,因此其他线程可以访问它们。
如果您只在一个线程中创建/修改数组,或者传入一个以线程安全方式复制的副本,那就没问题了。
答案 1 :(得分:1)
该方法本身是线程安全的,因为它只接受它的参数并读取它们,而不将它们发布到任何其他线程。但这并不意味着您不会遇到线程问题。这一切都取决于论据的来源。
如果参数构成线程之间的共享状态,则应以某种方式同步对此状态的每次访问。但是您必须在线程之间建立同步策略以保护对此状态的访问。因此,此方法或此方法的调用方应确保对该状态的访问是线程安全的。在不知道参数来自何处的情况下,因此无法判断此代码是否是线程安全的。
答案 2 :(得分:0)
是的,它是线程安全的,因为你说只读数组,唯一可能的麻烦是,如果另一个线程在这个方法读取它的同时更新数组