Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
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: 2788
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


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Le 10 migliori offerte Amazon di Pasqua:...
Nuove fotografie dagli astronauti di Art...
La toilette della capsula Orion Integrit...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
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: 12:49.


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