Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2008, 18:21   #1
pumppkin
Member
 
Iscritto dal: Feb 2005
Messaggi: 295
[JAVA] sincronizzare thread

Ciao, sto facendo un esercizio sulla sincronizzazione dei threads in ambiente java...praticamente la situazione è questa: ho un server che gestisce l'arrivo di più thread; lo scopo dell'esercizio è quello di simulare la vendita di biglietti di un locale. Io nel thread avviato dal client arrivato c'è una chiamata ad un metodo statico, la chiamata al metodo avviene nel metodo run() del thread, che non fa altro che sottrarre il num di biglietti disponibili con il num di biglietti richiesti dal client...a questo punto dovrei gestire la sincronizzazione tra i thread..dovrei fare in modo che i thread eseguono questa sottrazione senza letture "sbagliate" cioè devo visualizzare il num di posti disponibili corretto...io ho scritto il metodo che effettua la sottrazione come synchronized ma solo questo non credo che basta. Non so se e dove andare ad inserire i metodi wait() e notify().
Questa è una parte del codice:

//all'interno del metodo run() del thread
richiestaClient = fromClient.readLine();
ServerLocale.Posti(richiestaClient);
ToClient.writeBytes("prenotazione effettuata");
...

//il metodo Posti si trova all'interno della classe principale...quella che gestisce l'arrivo dei thread

static int posti = 100;

synchronized static int Posti(String richiestaCliente){
posti = posti - Integer.parseInt(richiestaCliente);
return posti;
}

Ultima modifica di pumppkin : 17-04-2008 alle 18:32.
pumppkin è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2008, 19:18   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2773
Dov'è che visualizzi il numero di posti disponibili? Come mai non credi che basti?
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2008, 21:09   #3
pumppkin
Member
 
Iscritto dal: Feb 2005
Messaggi: 295
in effetti provando senza wait() e notify() funziona senza problemi...però stavo pensando una cosa...secondo te se due thread prenotano contemporaneamente i biglietti non si verifica nessun problema di lettura?...scusa ma sono alle prime armi con la programmazione concorrente...
pumppkin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 09:03   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Non vorrei dire una "fregnaccia" ma:
se la variabile statica che tiene traccia del numero di biglietti, il metodo che scrive sulla variabile e il metodo che legge la variabile stessero tutti e tre dentro la stessa classe e fossero synchronized allora appena uno di questi due metodi venisse invocato da un thread, quel thread otterrebbe il lock sull'istanza della classe, di fatto bloccando tutti gli altri eventuali thread, sia in lettura (tramite il metodo apposito) che in scrittura.

...

Azz da qualche parte avevo una guida molto ben fatta e chiara circa il threading in Java, se la trovo te la posto.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 09:31   #5
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Il metodo synchronized a quello serve: ad accodare eventuali chiamate multiple garantendo l' accesso univoco alla risorsa! Piu' che altro ormai tale meccanismo di mutua esclusione con la versione 6 di java è abbandonato in favore del meccanismo di lock().

In pratica basta racchiudere le istruzioni della sezione critica tra le istruzioni

lock.lock();
..............................
.............................
lock.unlock();

ovviamente lock è una variabile della classe Lock inizializzata dinamicamente ad una sua realizzazione concreta.

Detto questo non si capisce bene come tu effettui la prenotazione......il meccanismo deve funzionare pressochè cosi:
-ogni thread conosce il Server di prenotazione
-il server esporta i metodi di prenotazione che per forza di cose devono essere bloccati in mutua esclusione
-ogni thread effettua le chiamate di prenotazione sul server
Il thread deve credere di essere da solo ,mentre apunto il server deve preoccuparsi della giusta sincronizzazione degli accessi.
Inoltre non ha molto senso utilizzare variabili e metodi statici in questo caso.Il server dovrebbe presumibilmente essere in unica istanza.Da considerare anche l' utilizzo di variabili statiche potrebbe essere pericoloso ai fini della sincronizzazione anche se hai ben evitato questo problema con static synchronized.

Ultima modifica di nuovoUtente86 : 18-04-2008 alle 10:03.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 13:10   #6
ziociccio07
Senior Member
 
Iscritto dal: May 2007
Messaggi: 526
ma potrebbe fare una cosa del genere:

//il metodo Posti si trova all'interno della classe principale...quella che gestisce l'arrivo dei thread

static int posti = 100;

synchronized static int Posti(String richiestaCliente){

if (posti<richiestaCliente) try ....wait();
posti = posti - Integer.parseInt(richiestaCliente);
return posti;
notifyall();
}
ziociccio07 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 13:15   #7
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da ziociccio07 Guarda i messaggi
ma potrebbe fare una cosa del genere:

//il metodo Posti si trova all'interno della classe principale...quella che gestisce l'arrivo dei thread

static int posti = 100;

synchronized static int Posti(String richiestaCliente){

if (posti<richiestaCliente) try ....wait();
posti = posti - Integer.parseInt(richiestaCliente);
return posti;
notifyall();
}
Questo ha un senso qualora la risorsa sia rinnovabile,che ne so i tavoli che si liberano in un ristorante o per passare all' ambito informatico la lettura e utilizzo in maniera esclusiva di un file.Questo esercizio ha l' unico scopo di effettuare la prenotazione e quindi se non ci sono piu posti il metodo dovrebbe lanciare un' eccezione oppure piu banalmente restituire una booleana.
Inoltre per il tipo di situazione cui si attende fintanto che una certa condizione è vera esiste l' apposito strumento delle Condition utilizzato insieme appunto ai lock.

Ultima modifica di nuovoUtente86 : 18-04-2008 alle 13:18.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 13:27   #8
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
ovviamente la condition va protetta da un ciclo while che verifichi che il thread risvegliato o corrente abbia il diritto di eseguire le istruzioni del metodo.Si avrà qualcosa del genere

while(condizione non verificato)
condition.await();
........................
........................
.......................istruzioni
signal()/signalAll();
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 13:41   #9
ziociccio07
Senior Member
 
Iscritto dal: May 2007
Messaggi: 526
Quote:
Originariamente inviato da nuovoUtente86 Guarda i messaggi
Questo ha un senso qualora la risorsa sia rinnovabile,che ne so i tavoli che si liberano in un ristorante o per passare all' ambito informatico la lettura e utilizzo in maniera esclusiva di un file.Questo esercizio ha l' unico scopo di effettuare la prenotazione e quindi se non ci sono piu posti il metodo dovrebbe lanciare un' eccezione oppure piu banalmente restituire una booleana.
Inoltre per il tipo di situazione cui si attende fintanto che una certa condizione è vera esiste l' apposito strumento delle Condition utilizzato insieme appunto ai lock.
logico.
se i biglietti finiscono....sò finiti.
ho scritto solo un estratto di codice,per indicargli che se la risorsa è KO allora si ha wait/errore/...,mentre altrimenti "consuma" e notifica/segnala agli altri che ha consumato.
ziociccio07 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 13:49   #10
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da ziociccio07 Guarda i messaggi
logico.
se i biglietti finiscono....sò finiti.
ho scritto solo un estratto di codice,per indicargli che se la risorsa è KO allora si ha wait/errore/...,mentre altrimenti "consuma" e notifica/segnala agli altri che ha consumato.
ma nel caso specifico dei biglietti l' unica coda è quella sul lock esplicito o implicito che sia e viene risvegliata all' unlock in caso e all' uscita dal metodo sincronizzato nell' altro!Ovviamente in altri contesti bisogna attendere ficnhe non si ha il diritto di eseguire e logicamente si usano i vari wait(),condition ecc
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 14:02   #11
ziociccio07
Senior Member
 
Iscritto dal: May 2007
Messaggi: 526
si,certo.

a stò punto,potrebbe crearsi un nuovo Monitor,che ha la sola signal,senza wait,e che realizza la signal con dei semafori binari a coda,richiamando i metodi p() e v().


e quindi usa stò monitor.


elaboriosa,ma efficace.
ziociccio07 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 14:23   #12
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da ziociccio07 Guarda i messaggi
si,certo.

a stò punto,potrebbe crearsi un nuovo Monitor,che ha la sola signal,senza wait,e che realizza la signal con dei semafori binari a coda,richiamando i metodi p() e v().


e quindi usa stò monitor.


elaboriosa,ma efficace.
ma a che serve???

gia funziona con syncronized o al limite con i lock.Perchè complicarsi la vita?
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 14:27   #13
ziociccio07
Senior Member
 
Iscritto dal: May 2007
Messaggi: 526
appunto.
per questo ho detto che è elaboriosa.
ziociccio07 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 16:20   #14
pumppkin
Member
 
Iscritto dal: Feb 2005
Messaggi: 295
intanto grazie di tutte queste risposte e proposte....comunque alla fine come avevo detto prima il problema si è risolto con il solo synchronized...inoltre dopo l'ho fatto anche con wait() e notifyAll()...so che potrebbero anche non servire tutte queste cose però l'esercizio richiedeva di sincronizzare i threads...quindi...penso che vada bene così...grazie
pumppkin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 18:02   #15
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da pumppkin Guarda i messaggi
intanto grazie di tutte queste risposte e proposte....comunque alla fine come avevo detto prima il problema si è risolto con il solo synchronized...inoltre dopo l'ho fatto anche con wait() e notifyAll()...so che potrebbero anche non servire tutte queste cose però l'esercizio richiedeva di sincronizzare i threads...quindi...penso che vada bene così...grazie
Attento utilizzare wait e notifyAll dove non servono è un errore oltra che può creare malfunzionamenti.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 19:13   #16
pumppkin
Member
 
Iscritto dal: Feb 2005
Messaggi: 295
penso di non aver commesso errori nell'utilizzo wait() e notifyAll()...praticamente ho creato due nuovi metodi lockwriting e unlockwriting...all'interno del metodo run() del thread ogni client, prima di andare a modificare la variabile che tiene conto dei posti del locale, richiama il metodo lockwriting ponendo la variabile booleana writing a true inoltre se writing è già a true allora un thread va in wait...una volta modificata la variabile viene richiamato il metodo unlockwriting dove viene posta la writing a false e viene chiamato il notifyAll...in questo modo chi era in wait può andare ad occupare la risorsa...
pumppkin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 20:13   #17
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Quote:
Originariamente inviato da pumppkin Guarda i messaggi
penso di non aver commesso errori nell'utilizzo wait() e notifyAll()...praticamente ho creato due nuovi metodi lockwriting e unlockwriting...all'interno del metodo run() del thread ogni client, prima di andare a modificare la variabile che tiene conto dei posti del locale, richiama il metodo lockwriting ponendo la variabile booleana writing a true inoltre se writing è già a true allora un thread va in wait...una volta modificata la variabile viene richiamato il metodo unlockwriting dove viene posta la writing a false e viene chiamato il notifyAll...in questo modo chi era in wait può andare ad occupare la risorsa...
è cosa cosa orrenda che non serve a nulla o meglio è un modo di simulare uno sincronizzazione che però gia fai con syncronized.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 10:21   #18
pumppkin
Member
 
Iscritto dal: Feb 2005
Messaggi: 295
fai conto che anche i metodi lockwriting e unlockwriting sono synchronized...più che altro ho seguito una guida che ho trovato in rete...comunque tutto questo lo so che è abbastanza inutile, infatti avevo già scritto sopra che funzionava tutto anche con il solo synchronized, solo che per ora mi serve per esercitarmi o comunque capire in che modo posso fare la sincronizzazione tra i threads....

questa è la guida che, più o meno, ho seguito:
link

Ultima modifica di pumppkin : 19-04-2008 alle 10:23.
pumppkin è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 11:00   #19
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
Come vedi l' esempio del link è quello classico dei lettori/scrittori dove l' utilizzo del wait() ha senso per consentire ai lettori di accedere contestualmente alla risorsa qualora nessuno la sta modificando.Nel tuo caso tutti i thread sono paritari.
Questo meccanismo ora è offerto dal linguaggio tramite la concretizzazione ReadWriteLock della superclasse Lock.

Ultima modifica di nuovoUtente86 : 19-04-2008 alle 11:04.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 11:17   #20
pumppkin
Member
 
Iscritto dal: Feb 2005
Messaggi: 295
si ok hai ragione sul fatto che lì ha più senso...cmq come ti ho detto ho fatto solo una prova per vedere comunque se il programma girava senza problemi...adesso l'ho rimesso solo con il synchronized...cmq è strano che il prof non ha parlato della classe lock...ha parlato solo di wait notify, sleep, dei semafori, join...
pumppkin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
2 minuti: il tempo per scorrere le 25 of...
Mini LED TCL: confronto tra le migliori ...
Robot aspirapolvere: questi sono i più a...
Portatile tuttofare Lenovo Core i5/16GB ...
Scende a 99€ il tablet 11" 2,4K con...
Amiga: quali erano i 10 giochi più belli
Driver più sicuri: Microsoft alza...
Ego Power+ ha la giusta accoppiata per l...
Scompiglio nei listini Amazon: prezzi im...
Sotto i 105€ il robot Lefant che lava, a...
Mini proiettori smart in offerta: uno co...
Smartwatch Amazfit in offerta: Balance o...
Windows XP ritorna: ecco come usarlo sub...
Arrow Lake in saldo: Intel taglia i prez...
LG C4 da 55'' a 899€ è il top per...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:08.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v