util pattern getinstance example day_of_week java calendar

pattern - date java



¿Es seguro el java.util.Calendar o no? (3)

Aquí hay un enlace al código fuente de Calendar y GregorianCalendar en Java 7

Si lees el código, verás que ninguno de los métodos de instancia está sincronizado, y ninguno de los campos de instancia son volatile . También verá que incluso los métodos de get campos pueden hacer que una instancia de Calendario se mute. Y como no se realiza ninguna sincronización, los distintos subprocesos pueden ver versiones obsoletas de los campos de un objeto del Calendario después de dicha operación de mutación.

Para el registro, la acción de mutación en el campo métodos de obtención ocurre en / durante una llamada a este método:

1555 protected void complete() 1556 { 1557 if (!isTimeSet) 1558 updateTime(); 1559 if (!areFieldsSet || !areAllFieldsSet) { 1560 computeFields(); // fills in unset fields 1561 areAllFieldsSet = areFieldsSet = true; 1562 } 1563 }

En resumen, la clase Calendar no es segura para subprocesos, y GregorianCalendar tampoco lo es porque hereda los campos y métodos que no son seguros para subprocesos.

Pero no solo tome mi palabra por ello. Haga su propio análisis del código fuente.

Y, para colmo, la documentación no dice nada de una manera u otra, ni para el Calendario ni para la Fecha.

Si los javadocs no especifican la seguridad de subprocesos de una clase, debe asumir que no es seguro para subprocesos.

He estado trabajando bajo el supuesto de que ni Date ni Calendar son seguros para subprocesos, pero, durante una discusión reciente, un compañero de trabajo me dijo que Calendar era seguro para subprocesos.

Entonces, investigué un poco y no encontré nada. Hay mucha gente que sostiene que es seguro para subprocesos, y mucha gente que sostiene que no es seguro para subprocesos. Y, para colmo, la documentación no dice nada de una manera u otra, ni para el Calendar ni para la Date .

Entonces, ¿cuál es?


La documentación de Oracle no dice nada sobre la seguridad de subprocesos: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html .

El código fuente de OpenJDK (compilación b147) implementa java.util.Calendar de una manera no segura para subprocesos, por ejemplo:

public void setTimeInMillis(long millis) { // skipped time = millis; isTimeSet = true; areFieldsSet = false; computeFields(); areAllFieldsSet = areFieldsSet = true; }

Creo que es seguro asumir que la clase no es segura para subprocesos.


- No estoy seguro de dónde obtuvo la información su amigo, pero hablando en términos simples y directos, la Calendar class is no Calendar class is Thread safe .

- No encontré ninguna synchronized clave synchronized en las declaraciones atómicas, ni campos volatile en la clase Calendario ni en sus subclases.