2009-11-12 24 views
14

Quería que mi aplicación solo tuviera un objeto TimeZone que será utilizado por muchos objetos SimpleDateFormat y Calendar de otros lugares al mismo tiempo. Esto es para evitar tener que hacer siempre TimeZone.getTimeZone(ID).¿Es TimeZone de Java seguro para subprocesos?

SimpleDateFormat y Calendar clases no es seguro para subprocesos, por lo que puedo configurar un hilo para crear siempre nuevas instancias de ellos. Pero ¿qué pasa con TimeZone? No me queda claro si puedo hacer lo siguiente con seguridad:

final TimeZone tz = TimeZone.getTimeZone("GMT"); 
... 
//Thread 1. 
Thread t1 = new Thread(Runnable(){ 
    public void run() 
    { 
     Calendar cal = Calendar.getInstance(tz); 
     ... 
     SimpleDateFormat sdf = new SimpleDateFormat(); 
     sdf.setTimeZone(tz); 
     ... 
    } 
}); 
t1.start(); 
... 
//Thread 2. 
Thread t2 = new Thread(Runnable(){ 
    public void run() 
    { 
     Calendar cal = Calendar.getInstance(tz); 
     ... 
     SimpleDateFormat sdf = new SimpleDateFormat(); 
     sdf.setTimeZone(tz); 
     ... 
    } 
}); 
t2.start(); 
... 

Thanks!

Respuesta

4

No lo es.

Y usted no lo necesita. Se utiliza como código:

final TimeZone tz = TimeZone.getTimeZone("GMT"); 
...... 
// thread 1 SimpleDateFormat instance 
sdf.setTimeZone(tz); 

// thread 2 SimpleDateFormat instance 
sdf.setTimeZone(tz); 

Tiene dos hilos utilizando el mismo huso horario, pero ya que no se está modificando es que no es necesario que sea seguro para subprocesos.

Lo único que se puede modificar es el ID, pero incluso entonces estás bien, para el resto de los atributos se

La única manera que puede meterse en problemas es cambiando el ID de sólo lectura y al almacenar en caché la zona horaria, si la obtiene siempre del TimeZone.getTimeZone(), también está seguro, porque ese método es seguro para subprocesos.

7

Miré una vez el código fuente y llegué a la conclusión de que no era así.

Mire la clase JodaTime timezone. Dice en javadoc que es seguro e inmutable.

+0

1: JodaTime es la manera de hacerlo fecha/hora en Java. – BalusC

+1

He visto TimeZone.getDefault() colgar con frecuencia en un entorno de subprocesos múltiples. – Martin

1

No está modificando su zona horaria, por lo que su código debe ser seguro para subprocesos, independientemente de si la implementación subyacente de la zona horaria es seguro para subprocesos (con la excepción de los métodos estáticos, como (getTimeZone/getDefault/setDefault).

+0

En realidad, TimeZone.getDefault() y TimeZone.setDefault() obtener y establecer un defecto local de subprocesos. ¡Echa un vistazo al código fuente! –

+0

No :) no es, http://stackoverflow.com/questions/2176784/timezone-setdefault-changes-in-jdk6 – Tom

0

esto aparece a estar bien. Si nos fiamos de TimeZone.getDefault() que sería una historia diferente. Como otro hilo potencialmente podría estar llamando TimeZone.setDefault().

+0

En realidad, ** sería ** seguro. 'TimeZone.getDefault()' y 'TimeZone.setDefault()' obtienen y configuran un valor predeterminado de thread-local. ¡Echa un vistazo al código fuente! –

+0

¡Lo haré, gracias! –

+0

@StephenC: no, no es seguro. Mire http://stackoverflow.com/questions/2176784/timezone-setdefault-changes-in-jdk6 – Tom

2

no hay documentación que explícita Unidos Horario es seguro para subprocesos, por lo que la ruta más segura es suponer que no es segura para subprocesos.

La clase de zona horaria tiene dos mutators ejemplo, en relación con ID y su desplazamiento GMT. El sentido común diría que Calendar.getInstance y SimpleDateFormat no tienen ningún estado de objeto de negocio de zona horaria modificación (en el primer caso, se está utilizando como una clave de búsqueda, y en el segundo, como contexto de formato).

Sentido común o certeza: su elección.

Cuestiones relacionadas