Вы не можете сделать что-то поточно-ориентированное, если это не так. В случае Calendar
даже чтение данных из них не является поточно-ориентированным, поскольку может обновлять внутренние структуры данных.
Если это вообще возможно, я бы рекомендовал использовать Joda Time вместо:
- Большинство типов являются неизменяемыми
- Неизменяемые типы являются поточно-ориентированными
- Как правило, API намного лучше
Если у вас абсолютно есть для использования 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
Хотя это довольно противно. Конечно, вы можете иметь только один синхронизированный метод, который создавал клон исходного календаря каждый раз, когда это было необходимо, конечно ... возможно, что, вызвав computeFields
или computeTime
, вы могли бы сделать последующие операции чтения, конечно, поточно-ориентированные, но лично я не хотел бы попробовать это.