Hasta donde yo sé, java.util.Date
es mutable, por lo que no es seguro para subprocesos si varios subprocesos intentaron acceder y modificarlo. ¿Cómo utilizamos el bloqueo o la composición del lado del cliente (envoltorio) para que sea seguro para subprocesos?Cómo hacer que Java.util.Date sea seguro para subprocesos
Respuesta
En este orden, de mejor a peor:
lo uso para nada, echa un vistazo a jodatime
lo utilice en absoluto, usar
AtomicLong
o inmutable primitivalong
convolatile
para representar epoch timeEncapsularlo. Siempre devuelva una copia defensiva de
Date
, nunca una referencia al objeto internoSincronizar en
Date
instancia.
Me pregunto por qué consideraste que el segundo es mejor que el tercero? – peter
@ user1389813: ¡Buena pregunta! 1. Los primitivos son inmutables y, por lo tanto, implícitamente son seguros para subprocesos. 2. No puede, por coincidencia, devolver la referencia al objeto interno en lugar de una copia defensiva. 3. Más liviano, menos copiado (no es realmente un gran problema). Sin embargo, estoy de acuerdo, 2 y 3 son ambos bastante buenos. También obviamente 'Fecha' tiene mejor semántica que' largo'. –
Ya veo. El 2do punto que necesita el guardia con un candado ¿verdad? como @dystroy señaló que la operación de incremento no es atómica. – peter
No existe una solución simple para crear un contenedor seguro para subprocesos de la clase Date
. La mejor manera es sincronizar todos los usos de sus objetos usando los bloques synchronized
.
Luego necesita llevar ese bloque de sincronización donde quiera que lo use. ¿No es bueno en la práctica? – peter
Es horrible en el código. Esta es la razón por la que la respuesta de Tomasz es mucho mejor que la mía;) –
La solución más simple es nunca modificar una fecha y nunca compartirla. es decir, solo use la fecha para las variables locales.
Puede usar JodaTime ya que tiene objetos de fecha inmutables.
Puede usar el valor largo (milisegundos desde Época) en lugar de una instancia de Fecha. Asignarlo será una operación atómica y siempre será coherente.
Pero quizás su problema no esté en el valor de la fecha en sí, sino en todo el algoritmo, lo que significa que la respuesta real estaría basada en su problema real.
Aquí está un ejemplo de funcionamiento con errores en un contexto multi-hilo:
long time;
void add(long duration) {
time += duration;
}
El problema aquí es que es posible que tenga dos adiciones en paralelo lo que resulta en una sola adición efectiva, porque time += duration
no es atómica (que es realmente time=time+duration
).
No es suficiente usar un objeto largo en lugar de mutable. En este caso, podría resolver el problema configurando la función como sincronizada, pero otros casos podrían ser más complicados.
¿Qué quiere decir con 'su problema tal vez no está en el valor de los datos en sí, sino en todo el algoritmo – peter
Si' Estamos haciendo una operación larga comenzando por leer la fecha y terminar reemplazando el valor. Bloquear el valor durante la operación podría hacerlo. –
¿Ayudará si se convierte en volátil? – peter
- 1. ¿Este código es seguro para subprocesos? ¿Cómo puedo hacer que sea seguro para subprocesos?
- 2. ¿Cómo hacer que el acceso a los diccionarios sea seguro para subprocesos?
- 3. ¿La forma más simple de hacer que todo un método sea seguro para subprocesos?
- 4. Cómo hacer que boost asio fork sea seguro
- 5. Cómo hacer que mi código sea más seguro
- 6. ¿SecureRandom es seguro para subprocesos?
- 7. Directrices para probar el código multiproceso o asegurarse de que el código sea seguro para subprocesos
- 8. ¿El retorno es atómico y debería usarlo temporalmente en getter para que sea seguro para subprocesos?
- 9. ¿Es posible hacer que Oauth sea seguro en iOS?
- 10. Hacer que un método de actividad android sea seguro
- 11. ¿SQLite.Net es seguro para subprocesos?
- 12. ¿Es necesario que un método organizado en el subproceso de UI sea seguro para subprocesos?
- 13. ¿Cómo puede CopyOnWriteArrayList ser seguro para subprocesos?
- 14. ¿Es itertools seguro para subprocesos?
- 15. C++ Segmento seguro para subprocesos
- 16. ¿Es PHP seguro para subprocesos?
- 17. Enum.TryParse - ¿es seguro para subprocesos?
- 18. ¿Stream.Write es seguro para subprocesos?
- 19. NSTimer ¿es seguro para subprocesos?
- 20. EventAggregator, ¿es seguro para subprocesos?
- 21. ¿HttpContext.Current.Cache es seguro para subprocesos?
- 22. ¿DWScript es seguro para subprocesos?
- 23. ¿MongoDB es seguro para subprocesos?
- 24. ¿PrintWriter es seguro para subprocesos?
- 25. ¿Es System.ServiceModel.Channels.BufferManager seguro para subprocesos?
- 26. C# Singleton seguro para subprocesos
- 27. C#: ¿Cómo puedo hacer que un subproceso IEnumerable <T> sea seguro?
- 28. Opciones para hacer que el hilo ByteBuffer de Java sea seguro
- 29. ¿Cómo puedo hacer que un fallo predeterminado sea seguro para los clientes no habituales?
- 30. ¿Cómo puedo hacer que el código externo sea 'seguro' para ejecutar? Solo ban eval()?
Si ya estamos aquí, 'GregorianCalendar' y' SimpleDateFormat' tampoco son seguros para subprocesos. Siempre vale la pena recordar. –
Gracias por recordar – peter