Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-06-2008, 18:50   #1
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
[Java] concorrenza in servlet

Ciao a tutti.
Ho una action (o una servlet, poco cambia) che contiene una parte di codice in cui devo impedire l'esecuzione di più processi in contemporanea.
Trattandosi di una servlet, viene creata un'istanza diversa per ogni utente che la esegue (non è singleton).

Ho pensato di risolvere il problema in questo modo ma vorrei un vostro parere:

...
public static final String LOCK_V = "lock_ccu";

public String execute() throws Exception {
...
synchronized (LOCK_V)
{
//codice in concorrenza
...
}
...
}



In pratica eseguendo il synchronized sulla variabile statica LOCK_V impedisco che istanze diverse della servlet eseguano contemporaneamente la porzione di codice compresa nel blocco. Questo perchè LOCK_V è variabile di classe.

Che ne dite?
Non sto considerando qualcosa?

Ultima modifica di Swalke : 13-07-2008 alle 13:00.
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2008, 13:01   #2
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
UP.
Nessuno mi dice nulla?
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2008, 15:43   #3
smodeus
Member
 
Iscritto dal: Nov 2003
Messaggi: 40
Quote:
Originariamente inviato da Swalke Guarda i messaggi
Trattandosi di una servlet, viene creata un'istanza diversa per ogni utente che la esegue (non è singleton).
Sbagliato: il servlet container mantiene per ogni servlet una UNICA instanza, e per ogni richiesta viene creato un nuovo thread che eseguirà il metodo service della servlet, ed il successivo metodo doXXX


Quote:
Originariamente inviato da Swalke Guarda i messaggi
Ciao a tutti.
Ho una action (o una servlet, poco cambia) che contiene una parte di codice in cui devo impedire l'esecuzione di più processi in contemporanea.
[...]
Ho pensato di risolvere il problema in questo modo ma vorrei un vostro parere:

...
public static final String LOCK_V = "lock_ccu";

public String execute() throws Exception {
...
synchronized (LOCK_V)
{
//codice in concorrenza
...
}
...
}



In pratica eseguendo il synchronized sulla variabile statica LOCK_V impedisco che istanze diverse della servlet eseguano contemporaneamente la porzione di codice compresa nel blocco. Questo perchè LOCK_V è variabile di classe.
In linea di massima il tuo ragionamento è esatto, ma non è applicabile nel caso delle servlet perchè queste hanno una unica instanza nell'applicazione web:
che genere di risorsa devi gestire per gli accessi concorrenti?
ti faccio un esempio:
se hai un attributo del ServletContext e devi fare in modo che le diverse servlet vi accedano in maniera concorrente, ti basta costruirti un blocco synchronized che usa come mutex il ServletContext ogni volta che si accede a quello specifico attibuto.
smodeus è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2008, 22:47   #4
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
In pratica la porzione di metodo che volevo sincronizzare esegue un accesso al database ed estrae il valore di una variabile. In base al suo valore la aggiorna e crea un file con il nome di questa variabile.
In pseudoicodice ciò che deve essere sincronizzato è qualcosa di simile a questo:

Codice:
variabile=lettura variabile da DB;
if(variavile='a')
{
    salvataggio file "a.txt";
    variabile = 'b';
}
if(variavile='b')
{
    salvataggio file "b.txt";
    variabile = 'c';
}
if(variavile='c')
{
    salvataggio file "c.txt";
    variabile = 'd';
}
...
update variabile su db;
Quindi se due thread della servlet eseguono contemporaneamente questa porzione di codice potrei avere dei problemi dovuti alla concorrenza sulla variabile che viene estratta da db.

Se il thread 1 ha letto da db il valore 'a', io voglio che finisca di operare prima che un thread 2 concorrente legga la variabile da db.

Pensavo di avere risolto il problema.

Secondo te come posso risolvere?
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 10:49   #5
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9446
Quindi il tuo problema, se non sbaglio, e' quello di accedere in maniera concorrente al db ?

In tal caso penso tu possa "semplicemente" utilizzare un livello di isolamento appropriato al tuo caso, per evitare che i thread relativi alle varie richieste possano incorrere in "corse critiche".

P.S.: per quanto riguarda il "modello" dei servlet... non dovrebbe essere invocato il metodo init nel momento in cui viene caricata l'applicazione dal servlet engine ed essere, poi, creato un thread per ogni richiesta (GET o POST) ricevuta ?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 11:15   #6
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
Quote:
P.S.: per quanto riguarda il "modello" dei servlet... non dovrebbe essere invocato il metodo init nel momento in cui viene caricata l'applicazione dal servlet engine ed essere, poi, creato un thread per ogni richiesta (GET o POST) ricevuta ?
Quanto dici è corretto ed è quanto mi ha fatto notare anche smodeus poco più sopra.

Il fatto è che a me sembra di essermi tutelato in modo corretto sincronizzando quel blocco di codice.

I thread della servlet dovrebbero accedere in modo sincronizzato a quel blocco come mi pare di capire da qui: http://java.sun.com/docs/books/tutor.../locksync.html.

Quindi non ho ben capito cosa intende smodeus quando dice

Quote:
In linea di massima il tuo ragionamento è esatto, ma non è applicabile nel caso delle servlet perchè queste hanno una unica instanza nell'applicazione web
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 11:26   #7
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9446
Se la variabile e' statica e' condivisa da tutti i thread che vengono creati per cui credo che il synchronized possa essere utilizzato con "successo".

Imho, pero', visto che il problema e' relativo all'accesso al db prenderei in considerazioni di utilizzare in maniera "piu' pulita" i livelli di isolamento del db in questione.
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 11:34   #8
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
ma se l'accesso al db avviene in blocco che ho sincronizzato perchè dovrei avere problemi?
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 12:27   #9
smodeus
Member
 
Iscritto dal: Nov 2003
Messaggi: 40
Quote:
Originariamente inviato da Ed_Bunker Guarda i messaggi
P.S.: per quanto riguarda il "modello" dei servlet... non dovrebbe essere invocato il metodo init nel momento in cui viene caricata l'applicazione dal servlet engine ed essere, poi, creato un thread per ogni richiesta (GET o POST) ricevuta ?
Il servletContainer inizializza le servlet appunto instaziando la classe chiamano il metodo init(ServletConfig) che a sua volta richiama il metodo init() (per intenderci quello che noi possiamo sovrascrivere). A questo punto la servlet è inizializzata ed ad ogni HTTP request verrà creato un nuovo thread dall'unica instanza della servlet che eseguirà il metodo service(HttpServletRequest,HttpServletResponse)
E' questo metodo che decide quale dei metodi doXXX (doGet, doPost, etc) eseguire
Quindi init() (entrambi gli overload) vengono invocati 1 sola volta nel ciclo di vita della servlet, mentre service() viene invocato ogni volta c'è una nuova richiesta


Quote:
Originariamente inviato da Swalke Guarda i messaggi
Il fatto è che a me sembra di essermi tutelato in modo corretto sincronizzando quel blocco di codice.
I thread della servlet dovrebbero accedere in modo sincronizzato a quel blocco come mi pare di capire da qui: http://java.sun.com/docs/books/tutor.../locksync.html.
Quindi non ho ben capito cosa intende smodeus quando dice
...
public static final String LOCK_V = "lock_ccu";

public String execute() throws Exception {
...
synchronized (LOCK_V)
{
//codice in concorrenza
...
}
...
}


Ma è una sola servlet che accede a questo dato? In questo caso la soluzione va bene, se invece sono + servlet, allora questa soluzione non va bene, perchè nn ti garantisce l'accesso sincrono da parte di diverse servlet, che rappresentano classi diverse.
In generale cmq cercherei di non introdurre blocchi syncrhonized nelle servlet, ovviamente poi dipende anche dai "carichi" che potresti avere su quella servlet (quanti client posso contemporaneamente richiedere quella servlet)
smodeus è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 14:17   #10
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
Quote:
Ma è una sola servlet che accede a questo dato? In questo caso la soluzione va bene, se invece sono + servlet, allora questa soluzione non va bene, perchè nn ti garantisce l'accesso sincrono da parte di diverse servlet, che rappresentano classi diverse.
Si, in realtà il blocco è proprio all'iterno della servlet.
In realtà ho commesso un errore e chiedo perdono:
il metodo che ho chiamato "execute" nel mio esempio è in realtà un doGet o un doPost.

Dunque l'intestazione del mio metodo di esempio sarebbe la classica

public void doGet(HttpServletRequest request,
HttpServletResponse response)...

Quindi il blocco sincronizzato è all'interno del metodo della servlet che risponde alla richiesta.
Dunque la mia sincronizzazione è corretta vero?

Quote:
In generale cmq cercherei di non introdurre blocchi syncrhonized nelle servlet, ovviamente poi dipende anche dai "carichi" che potresti avere su quella servlet (quanti client posso contemporaneamente richiedere quella servlet)
Su questo siamo d'accordo, la mia era più che altro una richiesta a scopo didattico.

Ultima modifica di Swalke : 14-07-2008 alle 14:19.
Swalke è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Il rover NASA Perseverance ha ''raccolto...
NASA e ISRO hanno lanciato il satellite ...
Switch 2 ha venduto 5,82 milioni di cons...
Assassin's Creed Black Flag Remake: le m...
Cosa ci fa una Xiaomi SU7 Ultra alle por...
Promo AliExpress Choice Day: prezzi stra...
Nostalgico, ma moderno: il nuovo THEC64 ...
AVM avvia la distribuzione di FRITZ! OS ...
Super offerte Bose: le QuietComfort a me...
Epic vince (ancora) contro Google: Andro...
Sconti nuovi di zecca su Amazon: 27 arti...
Un'esplorazione del 'lato oscuro' di Fac...
Apple ha venduto 3 miliardi di iPhone da...
Grandi sconti oggi sugli spazzolini elet...
Reddit sfida Google: vuole diventare il ...
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: 22:39.


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