Ciao
Ho un dubbio..qualcuno sa quando in java è utile utilizzare un semaforo (crearsene uno oppure usare il pacceheto concurrent dalla java 1.5) invece che usare il synchronize?
cioè se io in un metodo faccio
void a(){
sem.acquire(); //acquisico semaforo
mie operaz..
sem.release();//lo rilascio
}
vuol dire che ho che "mie operaz" viene eseguito da un thread alla volta (mutua esclusione)? ^^ma allora non è la stessa cosa se io rendo il metodo "a()" sincronizzato??
alla fine il semaforo può essere questo, credo che counter deve essere 1???..uhm ho dei dubbi..che valore di count passo all'oggetto??
public class Semaphore {
private int counter;
public Semaphore() {
this(0);
}
public Semaphore(int i) {
if (i < 0) throw new IllegalArgumentException(i + " < 0");
counter = i;
}
/**
* Increments internal counter, possibly awakening a thread
* wait()ing in acquire().
*/
public synchronized void release() {
if (counter == 0) {
this.notify();
}
counter++;
}
/**
* Decrements internal counter, blocking if the counter is already
* zero.
*
* @exception InterruptedException passed from this.wait().
*/
public synchronized void acquire() throws InterruptedException {
while (counter == 0) {
this.wait();
}
counter--;
}
}
e come si vede ho cmq i metodi acquire e release sincronizzati perchè in entrambi si utilizza la stessa variabile counter..
Ma se counter che passo all'oggetto semaforo è >1, io posso fare la stessa operazione a + thread ma allora a questo punto non servirebbe a nulla cio non sarebbe una mutua esclusione perchè un numero = "counter" di thread potrebbero concorrentemente, assieme eseguire a??
grazie

Rispondi quotando