文档总是非常明确地处理使用一个以上线程的对象的一个实例的问题。一个对象的多个实例的并发问题
但是,我需要知道什么时候有一些线程同时拥有自己的实例?哪种干扰可能发生?我如何处理安静昂贵的成员SimpleDateFormat
?
感谢 迈克 [;-)
文档总是非常明确地处理使用一个以上线程的对象的一个实例的问题。一个对象的多个实例的并发问题
但是,我需要知道什么时候有一些线程同时拥有自己的实例?哪种干扰可能发生?我如何处理安静昂贵的成员SimpleDateFormat
?
感谢 迈克 [;-)
如果来自每个线程的代码正在访问同一类的不同实例(对象),那不是问题;除非当然,那些对象正在访问共享对象,例如类静态对象。
至于SimpleDateFormat
状态的文档:
日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。
为每个线程保留单独实例的一种方法是使用一个ThreadLocal
对象来跟踪单独的实例。
如果每个线程都有它自己的实例,您不使用静态,那么你是非常安全的:-)
没有并发性的问题!
对于您指出的SimpleDateFormat不是线程安全的,您可以选择使用公用类FastDateFormat,它是线程安全的并且可以共享。
更笼统地说,如果您在线程之间共享对象,请务必确保它们被标记为线程安全 - 文档应该始终指明这一点。如果它们不是线程安全的,则需要限制对它们的并发访问(例如,通过锁定/同步)或使用多个实例(每个线程一个)。一般来说,如果你不这样做,你就有可能会破坏共享数据/状态并导致不确定的结果。
看来“大多数人”使用线程本地日期格式。例如:
private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
@Override public DateFormat initialValue() {
return new SimpleDateFormat("fm/ts/tr", Locale.US);
}
};