Newsgroup: it.comp.java
Titolo: thread e synchronized?

Mi date una mano? probabilmente per la poca teoria non ne vengo fuori.
Client e server, qui una parte del codice client
if (liberi >0)
{
System.out.println ("\n==========");
System.out.println("Per la sala "+LA_SALA+ " sono ancora disponibili
"+liberi+" posti\n");	
System.out.println("-> Se vuoi prenotare digita --> Y");	
System.out.println("-> Se non vuoi prenotare digita --> N");
System.out.println ("\n========\n");
String PRENOTI_O_NO = LETTORE_TASTIERA.readLine();
int NPOSTO = (capienza - liberi) +1;
	if (PRENOTI_O_NO.equalsIgnoreCase("Y"))
	{
	if (NPOSTO<10)
		{
		String RIGA_MESSAGGIO = "B-"+"00"+NPOSTO+"-" ...
		SCRITTORE_SOCKET_PW.println(RIGA_MESSAGGIO);
Posso fare in modo che già da quando viene a verificarsi la condizione
liberi >0 vi sia una sincronizzazione del thread in modo che se io
client A mi connetto e il server mi risponde che:
Per la sala Astoria01 sono ancora disponibili 15 posti liberi
il client B che vi riesce ad accedere lo stesso (per ora) non mi
prenoti un posto e quindi il mio 15 non sia aggiornato?
non riesco a capire come fare da lato server....
Grazie e scusate per il solito disturbo.
--
Stucco
http://stucco.altervista.org

E' chiaro che non puoi sincronizzare il server dal client.
I casi sono due (entrambi server-side):
1) Nel momento in cui il client richiede il numero di posti disponibili
    il server impone un lock alle operazioni - per esempio usa una
    classe "semaforo"... Il semaforo viene poi sbloccato quando il
    client specifica l'azione: prenotazione o rinuncia.
2) E' però più elegante fare tutto quello che hai scritto nel client dal
    lato server. Sul client raccogli tutti i dati (quindi anche quanti posti
    si vogliono prenotare) e richiedi al server direttamente la prenotazione
    completa. Quando il server identifica il nuovo messaggio come una
    richiesta di prenotazione invoca un metodo synchronized che fa
    il check di posti liberi e se tale controllo passa effettua tale
    prenotazione. Infine il server notifica l'esito al cliente.
    Nota che per usare un metodo synchronized l'istanza della classe
    che realizza la prenotazione dev'essere univoca per tutti  i thread
    collegati a ipotetici relativi client.  Quindi un singleton!
Spero di esserti stato d'aiuto.
Luca Paganelli

 prenoti un posto e quindi il mio 15 non sia aggiornato?
Hai una risorsa condivisa (la matrice di posti), e una serie di richieste 
di allocazione da soddisfare - classico che piu' non si puo'. ;)
Il trucco sta nel mettere le richieste in coda: devi sincronizzare 
l'operazione di prenotazione. Lato server, ovviamente. Il client provera'
semplicemente ad eseguire un'operazione prenota(int posto) il cui risultato 
sara' vero o falso se il posto e' libero o meno. 
-- 
You dont know what to do when you dont know what you're doing.
http://space.tin.it/computer/csadun



Sì luca, mi hai chiarito un po le idee (che prima erano veramente
confuse), e ci ho lavorato sopra (facevo diverse cose lato client che
andavano lato server :-P), ora mi manca solo di aggiungere il
singleton ma non so da dove farmi, va inserita nella classe che fa la
prenotazione (lato-client)? come e dove? ho cercato e ho anche letto
qua
http://java.sun.com/developer/technicalArticles/Programming/singletons/
 ma forse è il mio scarso inglese che nn mi aiuta...
come posso fare?
grazie
--
Stucco
http://stucco.altervista.org


http://space.tin.it/computer/csadun
--
Stucco
http://stucco.altervista.org

 lato server?
E dove condividi la risorsa-sedie? Chi ti assicura che due thread non 
cerchino di accaparrarsi la stessa sedia?
