多个对象实例的并发问题

时间:2009-12-03 09:21:31

标签: java multithreading

文档总是非常明确地处理使用具有多个线程的对象的一个​​实例的问题。

但是,当某些线程同时拥有自己的实例时,我需要知道什么?可能发生哪种干扰?如何处理SimpleDateFormat之类的成员安装费用昂贵?

由于 麦克风 [; - )

4 个答案:

答案 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);
     }
};