Java的时区线程安全吗?

2022-09-02 22:06:42

我希望我的应用程序只有一个对象,该对象将由许多对象和来自其他位置的对象同时使用。这是为了避免总是这样做。TimeZoneSimpleDateFormatCalendarTimeZone.getTimeZone(ID)

我知道和类不是线程安全的,这就是为什么我配置一个线程总是创建它们的新实例。但是呢?我不清楚我是否可以安全地执行以下操作:SimpleDateFormatCalendarTimeZone

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();
...

谢谢!


答案 1

我曾经看过它的源代码,得出的结论是它不是。

看看JodaTime时区类。它在javadoc中说它是线程安全和不可变的。


答案 2

事实并非如此。

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

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

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

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

您唯一可以修改的是ID,但即使这样,您也可以,因为其余属性是只读的

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


推荐