文档总是非常明确地处理使用具有多个线程的对象的一个实例的问题。
但是,当某些线程同时拥有自己的实例时,我需要知道什么?可能发生哪种干扰?如何处理SimpleDateFormat
之类的成员安装费用昂贵?
由于 麦克风 [; - )
答案 0 :(得分:7)
如果每个线程的代码访问同一个类的不同实例(对象),那不是问题;当然,除非那些对象正在访问共享对象,例如类静态对象。
正如SimpleDateFormat
所述的文档:
日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。
为每个线程保留单独实例的一种方法是使用ThreadLocal
对象来跟踪单独的实例。
答案 1 :(得分:3)
如果每个线程都有自己的实例,并且你不使用静态,那么你就很安全了: - )
没有并发问题!
答案 2 :(得分:1)
关于SimpleDateFormat,你指出它不是线程安全的,你可以选择使用commons类FastDateFormat,它是线程安全的并且可以共享。
更一般地说,如果您在线程之间共享对象,请始终确保它们被标记为线程安全 - 文档应始终指明这一点。如果它们不是线程安全的,则需要限制对它们的并发访问(例如,通过锁/同步)或使用多个实例(每个线程一个)。通常,如果不这样做,则可能会破坏共享数据/状态,从而产生不确定的后果。
答案 3 :(得分:0)
似乎“大多数人”使用线程本地日期格式。类似的东西:
private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
@Override public DateFormat initialValue() {
return new SimpleDateFormat("fm/ts/tr", Locale.US);
}
};