Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
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: 9505
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: 9505
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


Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Anche T-Mobile abbandona VMware e migra ...
In Italia crescono gli investimenti nell...
Samsung combina IA e quantum computing p...
Anthropic ammette: Claude Code usa un ap...
L'IA costa sempre di più: AWS aum...
Google prepara il blocco delle app non v...
Amazfit aggiorna il Cheetah 2 Ultra: ric...
L'FAA apre ai voli commerciali supersoni...
Amazon ha già abbastanza satelliti per a...
A2A ed Equinix uniscono le forze per rec...
Apple ha creato la crisi delle memorie? ...
GPU subito in cambio di una quota dei ri...
Firefly Aerospace potrà lanciare ...
Intesa Sanpaolo sposta i sistemi IT core...
Visa, Mastercard e Coinbase lanciano Ope...
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: 18:25.


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