2009-12-03 3 views
1

документация всегда очень четко описывает проблемы использования одного экземпляра объекта с несколькими потоками.Вопросы Concurrecy с несколькими экземплярами объекта

Однако что мне нужно знать, когда есть потоки, которые имеют свой экземпляр одновременно? Какое вмешательство может возникнуть? Как мне обращаться с такими членами, как 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); 
    } 
}; 
Смежные вопросы