Perché esemplificazione pigro del MessageResourcesFactory in Struts 1.2.7?
-
19-09-2019 - |
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:
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?