Pagina 1 di 1

[Risolto] [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 18:46
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 :)

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 19:18
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
	}
 }

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 19:32
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!

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 19:50
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

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 20:05
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!

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 20:08
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.

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 20:15
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 :)

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 20:45
da Zoff
No non basta.

Devi definire tutti i metodi pubblici come synchronized.

Re: [Java] Pattern SingletonLock

Inviato: sabato 9 giugno 2012, 21:39
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!

Re: [Java] Pattern SingletonLock

Inviato: domenica 10 giugno 2012, 0:31
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.