Newsgroup: it.comp.java
Titolo: sinctonizzazione java

Ipotesi: Ho una classe Cisterna, una classe PompaIngresso e una classe
PompaUscita. La cisterna è inizialmente vuota, ha capacità illimitata
ed è condivisa dalle due pompe una che inserisce l'acqua ed una che ne
preleva la stessa quantità.
Ovviamente le due pompe saranno due thread che condividono un oggetto
cisterna.
ho creato la classe Cisterna in questo modo:
public class Cisterna{
   private int Contenuto;
   public Cisterna(int c){ this.Contenuto = c; }
   public synchronized void Inserisci(int q){ Contenuto += q; }
   public synchronized void Preleva(int q){
      if(Contenuto >= q)
      {
            Contenuto -= q;
      }
   }
}
secondo voi è giusta????

 ha scritto nel messaggio 
news:1150451891.1...@c74g2000cwc.googlegroups.com...
Cosi' non possiamo dirti nulla.
Dipende da come viene usata e il contesto in cui si trova. 

 secondo voi è giusta????
Si, il principio è esattamente quello che hai rappresentato.

 ha scritto nel messaggio 
news:449296e6$0$993$5fc...@news.tiscali.it...

scusa non avevo letto la parte dei thread ;) 

 public synchronized void Inserisci(int q)
tu dici che le pompe aggiungono e tolgono una *stessa* quantità di 
acqua. Devo quindi immaginare che nelle classi PompaX il valore di "q" 
sia il medesimo "a priori"?
Alex.

 sia il medesimo "a priori"?
credo gli stiano chiedendo di reinventare la ruota scrivendo una 
implementazione di java.util.concurrent.BlockingQueue<E>
-- 
sbi

all'interno dei 2 thread il valore q passato ai due metodi è il
medesimo ma puo essere una volta 5 (in ingresso e in uscita) e una
volta 1000.
Io normalmente programmo in VB e mi hanno abituato a scrivere i nomi
delle variabili con la prima lettera maiuscola anche perchè poi
l'editor le riconosce e se mi mette la maiuscola mi rendo conto di
averla scritta bene......bug evitati per errori di battitura
APB ha scritto:


ma che differenza c'è a scrivere una classe con i metodi sincronizzati
e scrivere una classe normale e poi definire syncronized l'istanza
dell'oggetto dal main???
spero di essere stato chiaro


spero di non sbagliare, ma in questo caso è synchronized la creazione
dell'oggetto, non il suo utilizzo...

 dell'oggetto dal main???
Forse ti riferisci ai blocchi synchronized in cui specifichi l'istanza 
di un oggetto:
synchronized(obj) {
}
la sintassi acquisisce il lock sull'oggetto obj che viene rilasciato 
all'uscita del blocco. Ciò impedisce solo che un'altro thread possa 
acquisire il lock sullo stesso oggetto, ma non rende l'oggetto 
thread-safe. Il codice non sinchronized dell'oggetto può essere 
certamente eseguito in concorrenza.

 certamente eseguito in concorrenza.
Scusa ma non riesco a capire.
Dici che acquisisce il lock sull'oggetto ma che il codice non syncro
puo essere eseguito in concorrenza ma non sono due cose in contrasto???
Puoi farmi un esempio?

            Contenuto -= q;
fosse lanciato Inserisci non ne scaturirebbero errori
(poi probabilmente i syncornized meglio metterli e
non stare tanto a pensarci)
Ciao
Chairam

 fosse lanciato Inserisci non ne scaturirebbero errori
beh, ma potrebbe essere invocato Preleva e invalidare la condizione
dell'If...in tal caso contenuto te lo trovi negativo...

 perchè: anceh se tra:


 puo essere eseguito in concorrenza ma non sono due cose in contrasto???
Assolutamente no.
Ritorniamo alla teoria: quando un thread deve eseguire un blocco 
synchronized deve acquisire un lock esclusivo sull'oggetto. Quando 
invece deve eseguire del codice non-synchronized non deve acquisire 
nulla. In ogni caso ti aspetti che il codice non-synchronized venga 
eseguito in concorrenza.
La sintassi che ti ho citato consente di acquisire il lock sull'oggetto, 
  quindi impedisce ad altri thread di fare altrettanto eseguendo in 
concorrenza codice synchronized di quell'oggetto. Non può impedire di 
eseguire codice non-synchronized perchè ciò non necessita di acquisire 
alcun lock.