Per quanto ne so che java.util.Date
è modificabile, quindi non è thread-safe se più thread hanno provato ad accedere e modificarlo. Come utilizziamo il locking o la composizione lato client (wrapper) per renderlo thread-safe?Come rendere Java.util.Date thread-safe
risposta
in questo ordine, dal migliore al peggiore:
non si usa affatto, controlla jodatime
non si usa affatto, utilizzare
AtomicLong
o immutabile primitivalong
convolatile
di rappresentare tempo epocaIncapsulare. Restituire sempre la copia difensiva di
Date
, mai un riferimento all'oggetto internoSincronizzare sull'istanza
Date
.
Mi chiedo perché hai considerato il 2 ° migliore del 3 °? – peter
@ user1389813: Buona domanda! 1. I primitivi sono immutabili e quindi implicitamente sicuri del thread. 2. Non è possibile, per coincidenza, restituire il riferimento all'oggetto interno anziché una copia difensiva. 3. Più leggero, meno copia (non proprio un grosso problema). Comunque sono d'accordo, 2 e 3 sono entrambi abbastanza buoni. Anche ovviamente 'Date' ha una semantica migliore di' long'. –
Vedo. Il secondo punto ti serve la guardia con un lucchetto vero? come @dystroy ha sottolineato che l'operazione di incremento non è atomica. – peter
Non esiste una soluzione semplice per creare un wrapper thread-safe della classe Date
. Il modo migliore è sincronizzare tutti gli usi degli oggetti utilizzando i blocchi synchronized
.
Quindi devi portare quel blocco di sincronizzazione ovunque lo usi. Non è buono nella pratica? – peter
È terribile nel codice. Questo è il motivo per cui Tomasz risponde è molto meglio del mio;) –
La soluzione più semplice è non modificare mai una data e non condividerla mai. Ad esempio, utilizza solo la data per le variabili locali.
È possibile utilizzare JodaTime in quanto ha oggetti di data immutabili.
È possibile utilizzare il valore lungo (millisecondi da Epoch) anziché un'istanza Date. Assegnarlo sarà un'operazione atomica e sarebbe sempre coerente.
Ma il tuo problema forse non è sul valore Data stesso ma sull'intero algoritmo, il che significa che la risposta reale sarebbe basata sul tuo vero problema.
Ecco un esempio di un'operazione buggy in un contesto multithread:
long time;
void add(long duration) {
time += duration;
}
Il problema qui è che si può avere due aggiunte in parallelo con conseguente sola aggiunta efficace, perché time += duration
non è atomica (è davvero time=time+duration
).
L'utilizzo di un oggetto lungo anziché normale non è sufficiente. In questo caso è possibile risolvere il problema impostando la funzione come sincronizzata, ma altri casi potrebbero essere più complicati.
Cosa intendi per 'il tuo problema forse non è sul valore dei dati stessi ma sull'intero algoritmo – peter
Se tu? Stai facendo una lunga operazione iniziando leggendo la data e finendo sostituendo il valore. Il blocco del valore durante l'operazione potrebbe farlo. –
aiuterà a renderlo volatile? – peter
- 1. Come posso rendere AllocateHwnd threadsafe?
- 2. Come inizializzare java.util.date su empty
- 3. java.util.concurrent.Future threadsafe?
- 4. Serializzare java.util.Date
- 5. Come inviare java.util.Date in Json?
- 6. È NSUserDefaults threadsafe
- 7. annotazione chiamato ThreadSafe
- 8. @GuardedBy, @ThreadSafe, @ NotThreadSafe
- 9. Java: ServerSocket.accept è threadsafe?
- 10. Proprietà threadsafe generica
- 11. Ruby's Net :: HTTP threadsafe?
- 12. Datastax - Is PreparedStatement threadsafe?
- 13. get Year from java.util.Date
- 14. GWT java.util.Date serialization bug
- 15. java.util.Date a XMLGregorianCalendar
- 16. java.util.Date get millisecondi
- 17. java.util.Date non supportato
- 18. java.util.Date utilizza TimeZone?
- 19. Come convertire java.util.Date in Java8 java.time.YearMonth
- 20. Conversione di stringhe in java.util.Date
- 21. Convertire da java.util.date a JodaTime
- 22. Un DAO per thread o DAO threadsafe?
- 23. Come utilizzare java.sql.Timestamp come vero java.util.Date con JPA
- 24. Get java.util.Date fuori da Joda Time DateTime
- 25. Data Javascript e argomento costruttore java.util.Date
- 26. JSON `date (...)` a `` java.Util.Date` utilizzando org.json`
- 27. Ottieni la data in passato utilizzando java.util.Date
- 28. come convertire la stringa di data/ora in java.util.Date
- 29. Come convertire Joda-Time DateTime in java.util.Date e viceversa?
- 30. Come convertire oggetti java.util.Date in oggetti di Calendar?
Se siamo già qui, 'GregorianCalendar' e' SimpleDateFormat' non sono thread-safe. Vale sempre la pena ricordare. –
Grazie per aver ricordato – peter