[Risolto] [Java] Pattern SingletonLock

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Carlit0sway+
Prode Principiante
Messaggi: 92
Iscrizione: martedì 16 dicembre 2008, 17:26

[Risolto] [Java] Pattern SingletonLock

Messaggio da Carlit0sway+ »

Salve. Come posso usare la seguente classe?

Codice: Seleziona tutto

public class SingletonLock {
	
	  private static SingletonLock singl = null;
	  
	  public synchronized static SingletonLock getInstance() {
	    if (singl==null)
	      singl = new SingletonLock(); // una sola istanza
	    return singl;
	 }

	  private SingletonLock() {
	  }
}
Mi serve perché ho un'applicazione multithreading. Voglio, entro un limite di tempo, assegnare la vittoria al thread che vende più oggetti.
Esempio:
venditore V1 vende 10 oggetti al tempo t1
venditore V2 vende 10 oggetti al tempo t2
server registra la vendita di V1 al tempo t3
server registra la vendita di V2 al tempo t4
scade il timer
Vince V2. Invece Voglio che vinca V1.
Cioè deve avvenire che ogni venditore
- richiede il lock (e va in wait)
- il server concede il lock, sveglia il thread e va in wait
- il venditore notifica al server, che registra l'operazione
- il venditore rilascia il lock

Grazie :)
Ultima modifica di Carlit0sway+ il lunedì 11 giugno 2012, 11:21, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Java] Pattern SingletonLock

Messaggio da Zoff »

Le keyword synchronized e static non hanno senso di lavorare insieme.
Il lock del synchronized tratta l'istanza di oggetto come un monitor, quindi è inutile se è static.

Se vuoi un pattern singleton thread safe devi usare:

Codice: Seleziona tutto

public class SingletonClass{
	/**
	 * Singleton instance holder
	 */
	private static class SingletonHolder {
		public static SingletonClass instance = new SingletonClass();
	}

	/**
	 * Singleton entry-point. Returns the only instance in the system.
	 */
	public static SingletonClass getInstance() {
		return SingletonHolder.instance;
	}

	private SingletonClass() {
		// Costruttore reale
	}
 }
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Carlit0sway+
Prode Principiante
Messaggi: 92
Iscrizione: martedì 16 dicembre 2008, 17:26

Re: [Java] Pattern SingletonLock

Messaggio da Carlit0sway+ »

Capito. Grazie mille!
E qual è il metodo corretto di utilizzo (è la prima volta che uso questo pattern)?
ipotizzo.
Creo l'istanza del Lock nel main del server (perché deve essere una unica)

Codice: Seleziona tutto

SingletonClass lock = SingletonClass.getInstance()
passo il riferimento lock ad ogni server thread creato per gestire i vari client thread che fanno le loro richieste. Giusto?
Come fa il client thread a chiedere esplicitamente il lock prima di fare la sua operazione? (ed andare in wait eventualmente)?

Grazie!
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Java] Pattern SingletonLock

Messaggio da Zoff »

Non hai bisogno di passare il riferimento. Ogni Thread può richiamare il getInstance(). Il lock sugli altri metodi della classe lo devi gestire tu, con synchronized, Lock o altro
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Carlit0sway+
Prode Principiante
Messaggi: 92
Iscrizione: martedì 16 dicembre 2008, 17:26

Re: [Java] Pattern SingletonLock

Messaggio da Carlit0sway+ »

Zoff ha scritto:Non hai bisogno di passare il riferimento. Ogni Thread può richiamare il getInstance().
Capito. E sono sicuro che non vengano create più istanze del Singleton lock in quanto i server thread condividono lo stesso creato nel main del server?
Zoff ha scritto: Il lock sugli altri metodi della classe lo devi gestire tu, con synchronized, Lock o altro
Uso di solito synchronized.
Quali altri metodi della classe servirebbero per concedere un lock ai clientThread e rilasciarlo? Solo getInstance() è sufficiente o cos'altro mi serve nella classe Singleton?

Grazie ancora!
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Java] Pattern SingletonLock

Messaggio da Zoff »

Con la classe indicata hai la certezza che una sola istanza sia creata e distribuita.

Oltre a synchronized si possono utilizzare i Lock prensenti nel package java.concurrent, ma ha senso utilizzarli solo se si sa cosa fanno e come funzionano.

Se non ne hai mai sentito parlare continua ad usare synchronized, otterrai un codice potenzialmente meno performante ma funzionante.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Carlit0sway+
Prode Principiante
Messaggi: 92
Iscrizione: martedì 16 dicembre 2008, 17:26

Re: [Java] Pattern SingletonLock

Messaggio da Carlit0sway+ »

Ok.
Ma ancora non ho capito una cosa nello schema di comunicazione: mi serve che un clientThread deve richiedere il lock al ServerThread e il Server lo concede.
La classe sopra è sufficiente, con il solo metodo statico getInstance()?
Qual è lo schema? Il ServerThread fa getInstance() e poi passa il lock ottenuto al clientThread?

Grazie e pardon la duraggine di comprensione :)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Java] Pattern SingletonLock

Messaggio da Zoff »

No non basta.

Devi definire tutti i metodi pubblici come synchronized.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Carlit0sway+
Prode Principiante
Messaggi: 92
Iscrizione: martedì 16 dicembre 2008, 17:26

Re: [Java] Pattern SingletonLock

Messaggio da Carlit0sway+ »

Tipicamente che metodi saranno necessari?
Ipotizzo (scusa ma non ho mai utilizzato questo approccio).
Magari getLock() e releaseLock(), che rispettivamente settano a true/false un campo private boolean "used"?

Grazie!
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Java] Pattern SingletonLock

Messaggio da Zoff »

Forse sarebbe meglio che spiegassi piu' nel dettaglio cosa devi fare e qual'è la consegna.

Se è per un compito/esame sulla concorrenza conviene che prima guardi la teoria.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti