Domanda

Poiché esiste il problema ricontrollato bloccaggio quindi dobbiamo utilizzare la sincronizzazione per garantire l'accesso concorrente al seguente (classe org.apache.struts.util.MessageResources) Metodo:

LAZY istanziazione

public synchronized static MessageResources getMessageResources(String config) {

    if (defaultFactory == null) {
        defaultFactory = MessageResourcesFactory.createFactory();
    }

    return defaultFactory.createResources(config);
}

Perché non usare:

instantiation EAGER

static {

    // Construct a new instance of the specified factory class
    try {
        if (clazz == null)
            clazz = RequestUtils.applicationClass(factoryClass);
        MessageResourcesFactory defaultFactory =
            (MessageResourcesFactory) clazz.newInstance();
    } catch (Exception e) {
        LOG.error("MessageResourcesFactory.createFactory", e);
    }

}

E poi:

public static MessageResources getMessageResources(String config) {

    return defaultFactory.createResources(config);
}

Si consentirebbe l'accesso simultaneo ai getMessageResources metodo che, almeno nel mio caso può essere chiamato un bel paio di volte.

Le implicazioni quando non si usa sincronizzati sono qui:

http://en.wikipedia.org/wiki/Double-checked_locking

È stato utile?

Soluzione 4

Credo sia un modo per cavalletti per assicurarsi che funziona bene quando in modalità multi-thread, non importa se la persona imperative org.apache.struts.util.MessageResources definisce createResources (configurazione String) come sincronizzato o no .

Altri suggerimenti

È MessageResourcesFactory thread-safe? Il metodo synchronized protegge sia l'impostazione del campo e la chiamata al metodo createResources. Se è thread-safe il bloccaggio potrebbe essere spostato per coprire solo impostando il campo e lasciare la chiamata al metodo all'esterno della sezione critica.

L'overhead sostenuto con metodi sincronizzate su una JVM moderna è così piccolo da diventare insignificante. Le chiamate successive al metodo factory lazy-init sincronizzato sarà più o meno veloce come farebbe chiamate a un metodo ansioso-init non sincronizzato.

In termini di codice, l'approccio pigro-init è più semplice e più facile da capire (a mio parere) rispetto all'utilizzo di un blocco di inizializzazione statico. Inoltre, quando i blocchi di inizializzazione statica falliscono, può essere molto confusa per capire dove e perché.

A meno che non ci sia alcun motivo il MessageResourceFactory non può essere inizializzato nella fase iniziale (ad esempio, alcune risorse Servlet devono essere inizializzati prima), penso che mi piace la soluzione migliore. Direi che non c'è alcun motivo per il team Struts per caricare pigramente la fabbrica diverso da quello che è ciò che il particolare sviluppatore che ha lavorato a questo è abituato a fare (le persone tendono a caricare pigramente single, anche quando non è necessario).

Hai provato inviate un bug report, e proponendo la soluzione?

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