Будут ли конфликтующие методы с рефакторингом в веб-приложении Java-Struts?
Я работаю с компанией, которая производит веб-приложение, используя Struts с Java. Недавно я провел рефакторинг большого количества кода, чтобы привести систему в порядок. Одна из техник, которую я использовал, - это перемещение закрывающих операторов для потоков, в блоках finally, методов в служебный класс. Служебный класс является статическим и имеет закрытые методы для различных типов потоков. Делая этот рефакторинг, я сохраняю 5 строк кода каждый раз, когда необходимо закрыть поток, что уменьшило код в некоторых классах на 600 строк, что делает его очень удобным. Тем не менее, я обеспокоен тем, что это может привести к раздорам по этому методу, если он будет запущен в производство.
Раньше я сталкивался только с концепцией конфликта в многопоточном программировании, поэтому я не уверен, что это вызовет проблемы в этих случаях.
Это возможно? или просто мое недопонимание раздора, статических методов, веб-приложений и т. д.?
Заранее спасибо, Алексей Блю.
3 ответа
Если статические методы не работают исключительно с их параметрами и вы не пытаетесь одновременно закрыть один и тот же поток несколько раз, у вас все будет в порядке.
Методы в целом могут быть выполнены одновременно. Синхронизация всегда будет работать с объектами, поэтому конфликт не должен возникать, если объекты, которые вы используете в этих методах, полностью различны.
Рекомендуется закрыть все обработчики открытых файлов в одной и той же области видимости. Например, когда выходной поток файла открыт в методе, он также должен быть закрыт в этом методе. Это также предотвращает большинство проблем параллелизма (но не всегда). Тем не менее, существует множество исключений из-за того, что они этого не делают, но в этом случае будет сложнее отслеживать и закрывать все обработчики файлов.
К вашему сведению, существует закрывающий метод, который делает именно то, что вы описываете в Apache Common IO, IOUtils. Это популярная библиотека, которую вы можете использовать.
Это обычная практика, например, посмотрите на класс Closeables в Guava. Кстати, вам нужен только один метод, чтобы можно было закрыть практически все в Java:
public static void closeQuietly(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (RuntimeException re) {
// Do something or ignore...
}
}
}
Поскольку все Streams и Readers реализуют интерфейс Closeable, этого одного метода должно хватить для всех ваших потребностей.
В общем случае это не приведет к конфликту, если вы не попытаетесь прочитать из потока, скажем, Thread-A, где Thread-B закрывает поток. Но если бы это было так, то вы бы имели этот спор с или без этого рефакторинга. Исключительно этот рефакторинг не привнесет дополнительных раздоров.