2015-03-21 3 views
0

Рассмотрим следующий статический помощникДолжны ли эти короткие методы быть синхронизированы в Java?

public class DbUtil { 

    private static final Logger logger = LogManager.getLogger(DbUtil.class); 

    public static void closeAll(ResultSet rs, Statement stmt, Connection conn) { 
     close(rs); 
     close(stmt); 
     close(conn); 
    } 

    public static void close(Connection connection) { 
     if (connection != null) { 
      try { 
       connection.close(); 
      } catch (SQLException e) { 
       logger.error(null, e); 
      } 
     } 
    } 

    public static void close(Statement statement) { 
     if (statement != null) { 
      try { 
       statement.close(); 
      } catch (SQLException e) { 
       logger.error(null, e); 
      } 
     } 
    } 

    public static void close(ResultSet resultSet) { 
     if (resultSet != null) { 
      try { 
       resultSet.close(); 
      } catch (SQLException e) { 
       logger.error(null, e); 
      } 
     } 
    } 

    public static void closeAny(Object o) { 
     if(o == null) return; 

     try { 
      if (o instanceof Statement) { 
       Statement stmt = (Statement) o; 
       stmt.close(); 
      } else if(o instanceof Connection) { 
       Connection conn = (Connection) o; 
       conn.close(); 
      } else if(o instanceof ResultSet) { 
       ResultSet rs = (ResultSet) o; 
       rs.close(); 
      } else { 
       logger.warn("Unknown object type"); 
      } 
     } catch(SQLException e) { 
      logger.error(null, e); 
     } 
    } 

} 

Этот класс может быть использован множественный поток. Должны ли все его методы быть синхронизированы или некоторые из них и почему?

На самом деле, я не уверен, что после resultSet != null проверка одним формальным параметром потока изменяется с помощью другого экземпляра объекта другим потоком, и, таким образом, другой ResultSet, Statement или Connection закрываются (в случае методы не синхронизированы).

+0

Где заявление попытка принадлежит? – Crazyjavahacking

+0

Входы, извините, с поправками. – gumkins

ответ

2

Я не уверен, что это возможно, что после Resultset! = NULL проверки один нити формального параметра (ы) изменяется с экземпляром (ами) другого объекта другого потоком

Нет, метод аргументы имеют ту же семантику, что и локальные переменные. Они являются частными для одного вызова метода и не могут быть изменены каким-либо другим потоком.

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

+0

Если downvoter поделится тем, что не так с этим ответом, я, возможно, смогу его улучшить. Благодарю. –

+0

Привет Марко, означает ли это, что все упомянутые методы являются потокобезопасными без «синхронизированного» модификатора? – gumkins

+0

Да, вот что это значит. Методы полностью без гражданства. –

1

Начиная с Java 7 вы должны использовать гораздо проще код:

public class DbUtil { 

    private static final Logger logger = LogManager.getLogger(DbUtil.class); 

    public static void closeAll(AutoCloseable... resources) { 
     for (AutoCloseable resource: resources) 
      close(resource); 
    } 

    public static void close(AutoCloseable resource) { 
     if (resource != null) { 
      try { 
       resource.close(); 
      } catch (Exception e) { 
       logger.error(null, e); 
      } 
     } 
    } 
}