2011-11-04 9 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; 
    } 

Powyższa metoda statyczna wykonuje wyszukiwanie binarne. Czy wątek jest bezpieczny? Wiem, że zmienne lokalne są bezpieczne dla wątków, ale "a" tutaj jest tablicą, co oznacza, że ​​jest to obiekt w Javie, prawda? Czy to problem? Tablica jest właśnie czytana, niezmodyfikowana w żaden sposób, więc zakładam, że ta metoda jest bezpieczna dla wątków. Ale chcę się upewnić, że rozumiem dlaczego.Czy tablice Java w wątku statycznym są bezpieczne?

Dzięki!

Odpowiedz

7

Brak tablice nie są ogólnie rzecz biorąc, wątki bezpieczne. To, czy twój kod jest w tym przypadku, zależy od tego, czy inne wątki mają dostęp do tablicy, którą przekazałeś. Ponieważ tablice są przekazywane przez referencje, wtedy inne wątki mogą mieć do nich dostęp.

Jeśli tworzysz/modyfikujesz tablicę tylko w jednym wątku, lub jeśli przekażesz kopię skopiowaną w sposób bezpieczny dla wątków, wszystko będzie dobrze.

+0

Rozumiem. Więc kod nie jest bezpieczny dla wątków, mimo że tablica nie jest zmodyfikowana, prawda? Ale tak długo, jak każdy wątek, który wywołuje tę metodę, robi to z innym obiektem tablicy, życie jest dobre. – user247866

+4

BTW - Nie sądzę, że słusznie jest mówić, że tablice są przekazywane przez odniesienie (ale rozumiem, co miałeś na myśli). Dokładniej mówiąc, odniesienie do tablicy jest przekazywane przez wartość. Dzięki! – user247866

+1

Tylko dlatego, że jakiś inny wątek może go modyfikować w tym samym czasie, kiedy go czytasz. –

0

tak, to jest bezpieczne dla wątków, jak mówisz, tylko odczytać tablicę, jedynym możliwym problemem może być, jeśli inny wątek aktualizuje tablicę ten sam czas jak ta metoda czyta

+4

Inny wątek nadal może edytować element tablicy w tym samym momencie. – BalusC

+0

tak, to właśnie miałem na myśli –

+1

Początkowo nie było to w twojej odpowiedzi, edytowałeś je później w ciągu 5-minutowego okresu karencji. – BalusC

1

Sama metoda jest bezpieczna dla wątków, ponieważ pobiera tylko argumenty i czyta je, bez publikowania ich w żadnym innym wątku. Ale to nie znaczy, że nie możesz mieć problemu z gwintowaniem. Wszystko zależy od tego skąd pochodzą argumenty.

Jeśli argumenty stanowią współdzielony stan między wątkami, wówczas każdy dostęp do tego stanu powinien być w jakiś sposób zsynchronizowany. Ale musisz ustanowić politykę synchronizacji między wątkami, aby chronić dostęp do tego stanu. Tak więc ta metoda lub osoba wywołująca tę metodę powinna upewnić się, że dostęp do stanu jest bezpieczny dla wątków. Nie wiedząc, skąd pochodzą argumenty, nie można stwierdzić, czy ten kod jest bezpieczny dla wątków, czy nie.

Powiązane problemy