Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82

    problema singleton

    Mi potete spiegare perché se uso il codice sottostante...

    codice:
    public class TokenRing {
    		private static TokenRing singl = null;
    
    		public synchronized static TokenRing getInstance(int port) {
    			if (singl==null)
    				{singl = new TokenRing(port);
    				System.out.println("token instanziato");}
    			return singl;
    		}
    
    		private TokenRing(int port) {
    			
    		}
    
    	}
    ... e chiamo 2 volte getInstance mi stampa a video due volte "token instanziato" ???
    Grazie mille

  2. #2
    a prima vista manca il costruttore vuoto privato:
    codice:
    public class DBManager {
    
        private static DBManager instance = null;
    
        private DBManager() {
        }
    
        public static DBManager getInstance() {
            return (instance == null) ? (instance = new DBManager()) : instance;
        }
    .......
    poi nn ricordo bene ma nn so se il synchronized è "ammesso", ma nn vorrei dire stupidaggini.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82
    codice:
    public class TokenRing {
    		private static TokenRing singl = null;
    
    
    		public static TokenRing getInstance() {
    			if (singl==null)
    				{singl = new TokenRing();
    				System.out.println("token instanziato");}
    			return singl;
    		}
    
    		private TokenRing() {}
    
    		public synchronized void waitToken() {}
    
    		}
    Non vedo perchè il costruttore non possa avere parametri e sono sicuro che il syn sia permesso ma ho comunque provato, medesimo risultato. In pratica io lancio una classe due volte. questa classe contiene solo TokenRing.getInstance().waitToken() e a video mi continua a stampare che il token è stato inizializzato due volte.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    @GK4: usa i tag CODE quando posti del codice, come scritto nel regolamento interno.

    Comunque, a me funziona correttamente:

    codice:
    public static void main(String[] args) {
       TokenRing t1 = TokenRing.getInstance();
       TokenRing t2 = TokenRing.getInstance();
    }
    Stampa solo una volta (la prima).

    Cosa vuo dire "lancio una classe due volte"? Intendi in due JVM diverse? Se è così, è ovvio... ciascuna JVM ha i propri oggetti...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82
    In effetti il problema deve essere questo. Io devo mandare in run due volte la stessa classe in modo da avere due server e farli dialogare con una token ring. Io in pratica tramite eclipse semplicemente avvio due volte la stessa classe. A questo punto mi serve una specie di variabile globale che contenga il token che deve essere unico e pensavo di usare il singleton. Io sono obbligato a lanciare i server in questo modo, mi dite quindi che con il singleton non si può fare quello che volevo?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82
    quindi se dalle 2 classi faccio due getistance lavorano su oggetti diversi credo di aver capito. Come faccio a farli lavorare sul medesimo oggetto Non posso passarglielo in fase di creazione...

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    A meno di usare particolarità come RMI non lo puoi fare: due JVM distinte sono due processi distinti che non vedono nulla l'una dell'altra... sono due macchine virtuali diverse ed è come se girassero su due macchine fisiche diverse.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82
    Grazie dell aiuto, inizio ad essere a corto di idee, tu come faresti a far passare un token tra i nodi a cui non posso dare niente in comune, purtroppo non mi è concesso usare rmi, pensavo ad una socket ma essendo un anello non ho modo di eseguire prima le parti server per accettare la connessione.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non è che esista una sorta di alchimia: o puoi o non puoi.
    RMI non lo puoi usare.
    Le Socket nemmeno.

    L'unico altro modo possibile è scrivere su un file...

    Non vedo alternative, se non usare del codice nativo per cercare di instaurare una PIPE (supposto che il sistema operativo le supporti). Ma qui si esce dal mondo Java.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    82
    Grazie, spero di uscirne

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.