2011-11-04 50 views
8
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中的对象,对吧?那是问题吗? 数组刚刚被读取,没有以任何方式修改,所以我假设这个方法是线程安全的。但我想确保我明白为什么。静态方法中的Java数组是否安全?

谢谢!

回答

7

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

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

+0

我明白了。所以即使数组没有被修改,代码也不是线程安全的,对吧?但只要每个调用此方法的线程都使用不同的数组对象,生活就会很好。 – user247866

+4

顺便说一句 - 我不认为这是正确的说数组通过引用传递(但我明白你的意思)。更准确地说,数组引用是按值传递的。谢谢! – user247866

+1

仅仅因为其他线程可能会在您读取它的同时对其进行修改。 –

0

是的,它是线程安全的,你说你只读数组,唯一可能的故障可能如果另一个线程正在更新数组的同时,这种方法读取它

+4

另一个线程仍然可以在同一时刻编辑数组的一个项目。 – BalusC

+0

是的,这也是我的意思 –

+1

最初不是在你的答案中,你稍后在5分钟的宽限期内编辑它。 – BalusC

1

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

如果参数构成线程之间的共享状态,那么应该以某种方式同步对这个状态的每次访问。但是你必须在线程之间建立一个同步策略来保护对这个状态的访问。因此,此方法或此方法的调用者应确保对状态的访问是线程安全的。不知道参数来自哪里,因此不可能知道这些代码是否是线程安全的。