Domanda

Sto lavorando con una società che produce un'applicazione web utilizzando montanti con Java. Ho un sacco di refactoring del codice di recente per riordinare il sistema. Una tecnica che ho usato è quello di spostare le dichiarazioni di chiusura per i flussi, in , infine, blocchi, di metodi per una classe di utilità. La classe di utilità è statico ed ha metodi stretti per vari tipi di corsi d'acqua. In questo modo il refactoring risparmio 5 righe di codice ogni volta che un flusso deve essere chiuso che ha ridotto il codice in alcune classi da 600 linee che lo rende molto favorevole. Comunque io sono preoccupato in questo modo che può essere possibile causare un conflitto su quelli metodo se messo in produzione.

Sono venuto solo attraverso il concetto di contesa nella programmazione multithread prima che è il motivo per cui io non sono sicuro se questo causerà problemi in questi casi.

È possibile? o semplicemente la mia incomprensione della discordia, metodi statici, applicazioni web ecc?

Grazie in anticipo, Alexei blu.

È stato utile?

Soluzione

A meno che i metodi statici operano esclusivamente sulla loro parametri e non cercano di concomitanza vicino lo stesso flusso più volte si dovrebbe andare bene.

I metodi in generale può essere eseguito contemporaneamente. Synchronzation sarà sempre il lavoro sugli oggetti e quindi contesa non dovrebbe verificarsi se gli oggetti che si utilizzano in questi metodi sono completamente distinti.

Altri suggerimenti

E 'buona norma chiudere tutte gestore file aperto nello stesso ambito. Ad esempio, quando un file OutputStream è aperto in un metodo, allora dovrebbe anche essere chiuso con detto metodo. Questo anche a prevenire la maggior parte del problema di concorrenza (ma non sempre). Tuttavia, ci sono molti eccezione per non farlo, ma il monitoraggio e la chiusura di tutti gestore di file sarebbe più difficile in questo caso.

A proposito, esiste un metodo di chiusura che fa esattamente ciò che si descrive in Apache Comune IO, IOUtils . Si tratta di una libreria popolare che si può considerare l'utilizzo.

Questa è una pratica comune, per esempio un'occhiata alla classe Closeables in Guava. A proposito, si deve solo bisogno di un metodo per essere in grado di chiudere praticamente qualsiasi cosa in Java:

public static void closeQuietly(Closeable closeable) {
  if (closeable != null) {
    try {
      closeable.close();
    } catch (RuntimeException re) {
      // Do something or ignore...
    }
  }
}

Come tutti i torrenti e Lettori implementare l'interfaccia Closeable, questo metodo dovrebbe essere sufficiente per tutte le esigenze.

In generale, questo non causerà contesa, a meno che non si tenta di leggere dal flusso nel dire Thread-A, dove Thread-B sta chiudendo il flusso. Ma se così fosse, allora si avrebbe questa tesi con o senza questo refactoring. Solamente questo refactoring non introdurrà alcuna ulteriore contesa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top