Java的TimeZone是线程安全的吗?

His*_*His 16 java timezone thread-safety

我希望我的应用程序只有一个TimeZone对象,它将被许多SimpleDateFormat人和Calendar其他地方的对象同时使用.这是为了避免总是这样做TimeZone.getTimeZone(ID).

我知道SimpleDateFormat并且Calendar类不是线程安全的,这就是为什么我配置一个线程来始终创建它们的新实例.但那怎么样TimeZone?我不清楚我是否可以安全地执行以下操作:

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();
...
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ale*_*yak 7

我看了一下它的源代码并得出结论它不是.

看看JodaTime时区课程.它在javadoc中说它是线程安全且不可变的.


Osc*_*Ryz 6

它不是.

你不需要它.您的代码将其用作:

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

// thread 2 SimpleDateFormat instance
sdf.setTimeZone(tz);
Run Code Online (Sandbox Code Playgroud)

你有两个线程使用相同的时区,但由于你没有修改它,你不需要它是线程安全的.

您可以修改的唯一内容是ID,但即便如此,您也可以,因为其余属性是只读的

你可以遇到麻烦的唯一方法是更改​​id并将你自己的时区缓存,如果你总是得到它TimeZone.getTimeZone()也是安全的,因为这种方法线程安全的.