Будут ли конфликтующие методы с рефакторингом в веб-приложении 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 закрывает поток. Но если бы это было так, то вы бы имели этот спор с или без этого рефакторинга. Исключительно этот рефакторинг не привнесет дополнительных раздоров.

Другие вопросы по тегам