2009-12-03 58 views
1

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

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

感谢 迈克 [;-)

回答

7

如果来自每个线程的代码正在访问同一类的不同实例(对象),那不是问题;除非当然,那些对象正在访问共享对象,例如类静态对象。

至于SimpleDateFormat状态的文档:

日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。

为每个线程保留单独实例的一种方法是使用一个ThreadLocal对象来跟踪单独的实例。

3

如果每个线程都有它自己的实例,您不使用静态,那么你是非常安全的:-)

没有并发性的问题!

1

对于您指出的SimpleDateFormat不是线程安全的,您可以选择使用公用类FastDateFormat,它是线程安全的并且可以共享。

更笼统地说,如果您在线程之间共享对象,请务必确保它们被标记为线程安全 - 文档应该始终指明这一点。如果它们不是线程安全的,则需要限制对它们的并发访问(例如,通过锁定/同步)或使用多个实例(每个线程一个)。一般来说,如果你不这样做,你就有可能会破坏共享数据/状态并导致不确定的结果。

0

看来“大多数人”使用线程本地日期格式。例如:

private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() { 
    @Override public DateFormat initialValue() { 
     return new SimpleDateFormat("fm/ts/tr", Locale.US); 
    } 
};