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

Il metodo statico precedente esegue la ricerca binaria. È thread-safe? So che le variabili locali sono thread-safe ma "a" qui è un array, quindi significa che è un oggetto in Java, giusto? È un problema? L'array è appena stato letto, non modificato in alcun modo, quindi presumo che questo metodo sia thread-safe. Ma voglio essere sicuro di capire perché.Gli array Java in un metodo statico thread safe?

Grazie!

risposta

7

Nessun array non sono generalmente sicuro. In questo caso, il tuo codice dipende dal fatto che altri thread abbiano accesso all'array passato. Poiché gli array vengono passati per riferimento, altri thread possono accedervi.

Se si crea/modifica l'array in un singolo thread o se si passa una copia copiata in modo thread-safe, ciò andrà bene.

+0

Capisco. Quindi il codice non è thread-safe anche se l'array non è modificato, giusto? Ma finché ogni thread che chiama questo metodo lo fa con un oggetto array diverso, la vita è buona. – user247866

+4

BTW - Non penso sia giusto dire che gli array vengono passati per riferimento (ma capisco cosa intendevi). Più precisamente per dire che il riferimento dell'array è passato per valore. Grazie! – user247866

+1

Solo perché qualche altro thread potrebbe modificarlo nello stesso momento in cui lo stai leggendo. –

0

sì, è thread-safe, come dici tu sei solo la matrice, l'unico problema possibile può essere se un altro thread sta aggiornando l'array stesso momento in cui questo metodo lo legge

+4

Un altro thread può ancora modificare un elemento dell'array nello stesso momento. – BalusC

+0

sì, questo è quello che intendevo anch'io –

+1

Inizialmente non era nella tua risposta, l'hai modificato poco dopo nel periodo di grazia di 5 minuti. – BalusC

1

Il metodo stesso è thread-safe, poiché accetta solo i suoi argomenti e li legge, senza pubblicarli su altri thread. Ma ciò non significa che non si possa avere un problema di threading. Dipende tutto da dove provengono gli argomenti.

Se gli argomenti costituiscono uno stato condiviso tra thread, quindi ogni accesso a questo stato dovrebbe essere sincronizzato in qualche modo. Ma devi stabilire una politica di sincronizzazione tra i thread per proteggere l'accesso a questo stato. Quindi questo metodo, o il chiamante di questo metodo, dovrebbe assicurarsi che l'accesso allo stato sia thread-safe. Senza sapere da dove provengono gli argomenti, è impossibile stabilire se questo codice sia sicuro o meno.

Problemi correlati