Newsgroup: it.comp.java
Titolo: Singleton e synchronize

Ciao 
ho un problema di sincronizzazione che vorrei capire dal punto di vista
teorico.
Nella mia applicazione c'è un Singleton che gestisce la configurazione;
l'applicazione è strutturata con una serie di servlet che estendono  una
servletBase.
Nell'init della servletBase avviene l'inizializzazione del Singleton :
myConfig = Configuratore.setup(configFileName);
dove mySingleton è una variabile di classe protected della servlet
Il metodo setup è stato implementato così:
public class Configuratore {
   private final static Object classLock = Configuratore.class;
   private static boolean bErrore;
   private static Configuratore istanzaConfig = null;
   private static String nomeFileCfg = "";
   private Properties propConfig = null;
  public static Configuratore setup(String configFName) {
    synchronized (classLock) {
      // Se è già stato caricato ...ritorno l'istanza esistente
      if (configFName.equals(""))   {
            configFName = nomeFileCfg;
      }
      nomeFileCfg = configFName; 
      istanzaConfig = new Configuratore(configFName);
      if (bErrore)   {
             istanzaConfig = null;
             return null;
       }
      return istanzaConfig;
    }
  }
Il mio problema è che la configurazione può essere variata 'a caldo' da
un'altro punto dell'applicazione ....ovviamente il metodo precedente
effettua il new e quindi tutti i riferimenti alla vecchia istanza,
esistenti in altre classi, vanno persi.
A questo punto ho pensato di sostituire il new con un metodo privato di
reload della configurazione, ma non saprei come gestire correttamente la
sincronizzazione...cosa mi suggerite?
Il mio problema è come gestire in maniera corretta due richieste
contemporanee: una getInstance e una reload
grazie
--
ShadowMan
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 contemporanee: una getInstance e una reload
La new deve occorrere una sola volta, ok?
Quindi:
public class Configuratore {
    //  Se non vedo il costruttore non so a cosa serva...
   private static boolean bErrore;
   private static Configuratore istanzaConfig = null;
    private String nomeFile = null;
   private Properties propConfig = null;
    public static Configuratore getInstance()
    {
        if(istanzaConfig == null)
            istanzaConfig = new Configuratore();
        return istanzaConfig;
        // Quindi qui al limite crei un configuratore vuoto e basta!
        // Chi chiede l'istanza può o meno fare il setup successivamente
    }
  public synchronized void setup(String configFName) {
      if (configFName.equals(nomeFile))
     {
            configFName = nomeFileCfg;
      }
        // Qui chiami tutte le operazioni per rigenerare il Configuratore
        // sulla base delle informazioni del nuovo file!
        reload();
  }
}
Spero che questo incontri le tue esigenze.
Luca Paganelli

 Luca Paganelli
Ti ringrazio Luca...
in effetti sono stato poco preciso a postare il codice che non era
completo
Il metodo di setup è invocato solo nell'init della servlet e nella 
fase di reload a caldo; tutti gli altri client usano un getInstance()
del tutto
simile a quello da te (anche se ha un blocco sincronizzato all'interno).
La dichiarazione 
private static String nomeFileCfg = "";
mi serve perchè così, quando non passo il nomeFile al setup, posso
utilizzare
quello inviato precedentemente.
