2010-04-19 5 views
8

Как я понимаю, класс Exception Java, безусловно, не является неизменным (методы, подобные initCause и setStackTrace, дают некоторые подсказки об этом). Так это по крайней мере поточно-безопасно? Предположим, что у одного из моих классов есть поле:Java: класс исключений, потокобезопасный?

private final Exception myException; 

Можно ли передать это поле нескольким темам? Я не хочу обсуждать конкретные случаи, когда и почему эта ситуация может возникнуть. Мой вопрос больше связан с принципом: могу ли я сказать, что класс, который предоставляет поле типа исключения, является потокобезопасным?

Другой пример:

class CustomException extends Exception 
{ 
    ... 
} 

Является ли этот класс поточно-?

ответ

7

Обратите внимание, что initCause()synchronized и setStackTrace() копирует его параметр и затем выполняет одно назначение.

Таким образом, Exception действительно реализуется с учетом безопасности потоков. Тем не менее, я бы опасался какой-либо конструкции, где исключения обычно проходят между потоками (т. Е. По какой-либо причине, кроме обработки очень серьезного условия ошибки). Это просто неправильно.

+0

+1 для «просто неправильно». – Yishai

+0

Первый пример на самом деле гипотетический.Я почти не могу представить что-то подобное в моем коде :) Что касается второго примера. Могу ли я сказать в своей документации, что класс CustomException является потокобезопасным, и спят после? –

+0

@Vilius: вам нужно удовлетворить какое-то требовательное требование, заявив, что все классы «должны быть потокобезопасными»? И, конечно, поточно-безопасный суперкласс не делает потоки безопасными подклассы. Но да, я не потерял бы сон над этим. –

0

Я не считаю, что гарантии безопасности потоков предоставляются классами Java Exception.

+0

В настоящее время (т. Е. «В копии Throwable.java и т. Д., Которые в настоящее время содержатся в моей рабочей области»), классы исключений java не делают ни отказов, ни гарантий относительно безопасности потоков/параллелизма. Это большая проблема для классов, которые используются так широко, как эти. –

1

Для солнца реализации Java 6 метательного

initCause является synchronized так что поточно. fillInStackTrace тоже.

setStackTraceне, но он делает защитную копию ввода и затем присваивает эту копию. Конечно, этот метод «для rpc-фреймворков».

Пока ваше поле myException является окончательным или изменчивым, оно должно быть одобрено для общего доступа.

-1

Назначение исключения должно быть выбрано, когда условие обнаружено и обнаружено при его обработке. По определению это должно происходить в рамках одного потока. Если вы делитесь экземпляром Exception между потоками, вы используете его для целей, для которых он не был разработан. Это будет путать ваших читателей и сделать вашу программу менее ремонтопригодной. Вероятно, вам следует рассмотреть альтернативную структуру для того, что вы используете для нее.

+1

Я сказал по крайней мере два раза, что это скорее гипотетический вопрос ... Это действительно не имеет никакого отношения к дизайну любой программы. –

+0

Кажется, что далеко не так, чтобы произошла ошибка на одном (рабочем) потоке и обрабатывалась другим (запрос)? Я не вижу причин, по которым Исключения (/ Throwables) не должны быть потокобезопасными, поскольку это оставило бы подклассы свободными, чтобы быть потокобезопасными, если это необходимо. В худшем случае действительно, когда javadocs класса не упоминает threadafety/concurrency, так как это оставляет всю тяжелую работу (в случае Exception, миллионы) пользователей (ов) ... –

1

Я считаю, что безопасное издание Throwables/Exceptions - вполне правильный вопрос. Комментарий DJClayworth, что «если вы используете экземпляр Exception между потоками, то вы используете его для цели, для которой он не был разработан» не учитывает код управления задачами с помощью Futures. Обычно рабочий поток выдает исключение, и для этого исключения необходимо обработать другой поток. В дополнение ко всем комментариям выше, в которых упоминаются синхронизированные методы Throwable, Future публикует Исключения между потоками, поэтому я считаю, что можно с уверенностью сказать, что это ожидаемая, безопасная и поддерживаемая функциональность.

Смежные вопросы