如何使静态日历线程安全

cod*_*ody 8 java static calendar thread-safety

我想对一些静态方法使用Calendar并使用静态字段:

private static Calendar calendar = Calendar.getInstance();
Run Code Online (Sandbox Code Playgroud)

现在我读java.util.Calendar不是线程安全的.如何使这个线程安全(它应该是静态的)?

Jon*_*eet 14

如果不是,你不能做一些线程安全的东西.在这种情况下Calendar,即使从中读取数据也不是线程安全的,因为它可以更新内部数据结构.

如果可能的话,我建议改用Joda Time:

  • 大多数类型是不可变的
  • 不可变类型是线程安全的
  • 无论如何,它通常是更好的API

如果您必须使用a Calendar,则可以创建一个锁定对象并通过锁定放置所有访问权限.例如:

private static final Calendar calendar = Calendar.getInstance();
private static final Object calendarLock = new Object();

public static int getYear()
{
    synchronized(calendarLock)
    {
        return calendar.get(Calendar.YEAR);
    }
}

// Ditto for other methods
Run Code Online (Sandbox Code Playgroud)

虽然这很糟糕.您可以只使用一个同步方法,每次需要时创建原始日历的克隆,当然......通过调用computeFields或者computeTime您可以使后续读取操作线程安全,当然,但我个人而言我不厌其烦.