Quali sono i modi possibili per rendere il codice thread-safe senza utilizzare la parola chiave synchronized
?Codice thread-safe senza utilizzare la parola chiave `synchronized`?
risposta
Solo variabili/riferimenti locali ai metodi. O assicurati che tutte le variabili di istanza siano immutabili.
Le variabili di istanza immutabili non sono accettabili? – duffymo
@duffymo modificato – NimChimpsky
nice - short & to the point. –
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.
In realtà, un sacco di modi:
- Non c'è bisogno per la sincronizzazione a tutti, se non si dispone di stato mutevole.
- Nessuna necessità di sincronizzazione se lo stato mutabile è limitato a un singolo thread. Questo può essere fatto usando variabili locali o
java.lang.ThreadLocal
. - È 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 metodisynchronized
ed è ancora più potente.
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'? –
Non importa - Posso, usando java.util.concurrent.Semaphore. –
@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) –
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
"se le variabili di istanza sono immutabili, i loro riferimenti possono ancora essere modificati" no, non possono farlo – NimChimpsky
. 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
s è un riferimento, è cambiato, non è immutabile avresti bisogno di "stringa finale s" – NimChimpsky
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.
- 1. Java: quando utilizzare la parola chiave "this"
- 2. Utilizzare la parola chiave "this" nell'oggetto JavaScript
- 3. Perché utilizzare la parola chiave void?
- 4. nidificati sincronizzato parola chiave
- 5. struct senza typedef parola chiave
- 6. La parola chiave "var" ostacola la leggibilità del codice?
- 7. Quando è appropriato utilizzare la parola chiave extern senza utilizzare l'attributo [DllImport]?
- 8. Qualche ragione per non schiaffeggiare la parola chiave 'sincronizzata' ovunque?
- 9. Perché utilizzare la parola chiave globale in C#?
- 10. Perché utilizzare definire la parola chiave per definire una funzione
- 11. Utilizzare la parola chiave auto in C++ STL
- 12. Come utilizzare TRA la parola chiave in Entity Framework?
- 13. Come utilizzare al meglio la parola chiave const in C?
- 14. Non utilizzare 'System.Runtime.CompilerServices.DynamicAttribute'. Usa la parola chiave 'dinamica' invece
- 15. Devo utilizzare la parola chiave self (Proprietà) nell'implementazione?
- 16. Utilizzare questa parola chiave per ereditare?
- 17. Perché non è possibile creare oggetti senza utilizzare la parola chiave class?
- 18. È possibile utilizzare la parola chiave params in un delegato?
- 19. classi PHP perché utilizzare la parola chiave pubblica?
- 20. Utilizzare la parola chiave riservata a caso enum
- 21. Come utilizzare la parola chiave "riferimenti" in MySQL?
- 22. È meglio utilizzare gli alias di colonna con o senza la parola chiave AS?
- 23. La parola chiave "overload" fa la differenza?
- 24. evidenzia la parola nella stringa, se contiene la parola chiave
- 25. convertire la parola docx in doc senza utilizzare ole automation
- 26. Cosa fa la parola chiave box?
- 27. C: vale la parola chiave inline?
- 28. Perché JSLint proibisce la parola chiave "this"?
- 29. Quando passare la parola chiave ref in
- 30. parola chiave virtuale in C#
perché chiudere? È una buona domanda succinta – NimChimpsky
@NimChimpsky Non lo so neanche io, la domanda mi sembra perfettamente valida. È sicuramente rispondente e le risposte non sono qualcosa di soggettivo. – Malcolm