2012-04-26 17 views

risposta

4

Solo variabili/riferimenti locali ai metodi. O assicurati che tutte le variabili di istanza siano immutabili.

+0

Le variabili di istanza immutabili non sono accettabili? – duffymo

+0

@duffymo modificato – NimChimpsky

+0

nice - short & to the point. –

4

Puoi rendere il tuo codice thread-safe rendendo tutti i dati immutabili, se non c'è mutabilità, tutto è thread-safe.

In secondo luogo, si consiglia di dare un'occhiata all'API concomitante di Java che prevede la fornitura di blocchi di lettura/scrittura che funzionano meglio nel caso in cui ci siano molti lettori e pochi scrittori. Una parola chiave sincronizzata pura bloccherà anche due lettori.

7

In realtà, un sacco di modi:

  1. Non c'è bisogno per la sincronizzazione a tutti, se non si dispone di stato mutevole.
  2. Nessuna necessità di sincronizzazione se lo stato mutabile è limitato a un singolo thread. Questo può essere fatto usando variabili locali o java.lang.ThreadLocal.
  3. È inoltre possibile utilizzare i sincronizzatori incorporati. java.util.concurrent.locks.ReentrantLock ha la stessa funzionalità del blocco a cui si accede quando si utilizzano i blocchi e i metodi synchronized ed è ancora più potente.
+1

Preferisco (2), ma non sono sicuro che sia possibile implementare il passaggio dei messaggi senza utilizzare la parola chiave "sincronizzata". Posso fare una coda produttore-consumatore senza 'sincronizzata'? –

+1

Non importa - Posso, usando java.util.concurrent.Semaphore. –

+1

@MartinJames È possibile utilizzare qualsiasi classe simultanea come code e scambiatori senza sincronizzazione. (Utilizzano invece Lock). Il Disrupter supporta la messaggistica senza blocchi o sincronizzazione. (Ho una libreria che fa anche questo) –

-2

Perché devi farlo?

L'utilizzo solo di variabili/riferimenti locali non risolverà la maggior parte delle complesse esigenze aziendali. Inoltre, se la variabile di istanza non è modificabile, i loro riferimenti possono ancora essere modificati da altri thread.

Un'opzione è utilizzare qualcosa come un SingleThreadModel, ma è altamente sconsigliato e sconsigliato.

u può anche guardare api concorrente come suggerito in precedenza da Kal

+0

"se le variabili di istanza sono immutabili, i loro riferimenti possono ancora essere modificati" no, non possono farlo – NimChimpsky

+0

. Come vedo è se ho una variabile instanace String s = "xyz", My thread1 può cambiare il suo riferimento a s = "abc"; e thread2 ora otterrà s = ​​"abc" – Kshitij

+0

s è un riferimento, è cambiato, non è immutabile avresti bisogno di "stringa finale s" – NimChimpsky

1

Per mantenere la prevedibilità è necessario sia garantire l'accesso ai dati mutabile è fatto in modo sequenziale o gestire i problemi causati da accesso parallelo.

La protezione più grave utilizza la parola chiave synchronized. Oltre a ciò ci sono almeno due livelli di possibilità, ciascuno con i loro benefici.

Serrature/Semafori

Questi possono essere molto efficaci. Ad esempio, se si dispone di una struttura che viene letta da più thread ma aggiornata solo da uno, è possibile trovare utile ReadWriteLock.

I blocchi possono essere molto più efficienti se si sceglie il blocco in modo che corrisponda all'algoritmo.

Atomics

L'utilizzo di AtomicReference per esempio, può fornire spesso bloccare completamente la funzionalità gratuita. Questo di solito può offrire enormi benefici.

Il ragionamento dietro l'atomica è di consentire loro di fallire ma di dirti che hanno fallito in un modo in cui puoi gestirlo.

Ad esempio, se si desidera modificare un valore, è possibile leggerlo e quindi scrivere il suo nuovo valore fintantoché rimane il vecchio valore. Questo è chiamato "confronta e imposta" o cas e può essere normalmente implementato nell'hardware e quindi estremamente efficiente. Tutto ciò che serve è quindi qualcosa di simile:

long old = atomic.get(); 
while (!atomic.cas(old, old+1)) { 
    // The value changed between my get and the cas. Get it again. 
    old = atomic.get(); 
} 

Si noti, tuttavia, che la prevedibilità non è sempre il requisito.

Problemi correlati