PDA

View Full Version : [Java - Servlet] Sincronizzazione


franklyn
30-11-2005, 12:26
Ho una servlet che deve fare una connessione ad un database e deve
scrivere delle informazioni.
Voglio fare in modo di costituire una "sezione critica" per evitare di
sovrappore scritture e di evitare problemi di incoerenza dal punto di
vista semantico dei risultati.
Il mio problema è che non so come utilizzare una sorta di mutex o
semafori in java...cioè del tipo

"blocco semaforo"

//scrivo

"sblocco semaforo"

come dovrebbe essere tradotto in codice?

Riassumo con un esempio cosa voglio andare a gestire :

faccio una query che mi restituisce dei posti disponibili in quel momento,
nel frattempo se c'è un altro utente che fa una query simile gli potrà restituire alcuni degli stessi posti disponibili restituiti alla prima query e che magari pochi secondi dopo non sono + disponibili xkè l'utente della prima query li ha occupati.

Grazie ;)

sottovento
30-11-2005, 13:02
Ciao,
premetto che probabilmente, quello che vuoi fare, e' piu' facilmente risolvibile con un uso accorto degli strumenti messi a disposizione dal database (quali transizioni, ecc.).

Per quanto riguarda la costruzione di una sezione critica (Prima di J5):

1 - Dichiara e crea un oggetto di tipo qualsiasi (Object va bene, ma se hai un oggetto migliore lo puoi fare). Questo oggetto deve essere visibile a tutti i thread che vuoi sincronizzare.

2 - Quando vuoi accedere alla sezione critica, scrivi:

synchronized
{
obj.wait (); // Puoi metterci un timeout
// L'applicazione e' bloccata fintanto che qualcuno non sblocchera' con una obj.notify()/obj.notifyAll()

Fai qui quello che vuoi
}

Per sbloccare
synchronized
{
obj.notify();
}

C'e' una teoria che assicura che queste due primitiva sono sufficienti per simulare qualsiasi meccanismo di sincronizzazione, semafori compresi.

Cmq J5 ha nuove primitive per la sincronizzazione, probabilmente ha gia' quelle che ti interessano.

Spero di non aver preso fischi per fiaschi. Ti prego di perdonarmi se la risposta non c'entra niente con la domanda che avevi posto... :)

franklyn
01-12-2005, 00:22
+ o - è quello che volevo sapere.
Appena implemento e mi serve un aiuto te lo chiedo :D

In ogni caso... grazie per la risposta, gentilissimo ;)