CubbyHole.java 1/4

[
top][prev][next]
/* In questo file sono presenti due versione di CubbyHole, la prima
 * senza alcun tipo di controllo sull'accesso mentre nella seconda 
 * stata realizzata un'accesso sincronizzato. Nel primo caso,
 * produttore e consumatore scrivono / leggono nel buffer senza alcun
 * controllo e pertanto pu capitare che il consumatore legga due
 * volte lo stesso dato o che viceversa il produttore sovrascriva un
 * dato precedente senza che il consumatore abbia fatto in tempo a
 * leggerelo. La versione sincronizzata risolve questi problemi */

/* Versione NON SINCRONIZZATA */
public class CubbyHole {
	private int contents;

	synchronized public int get() {
		return contents;
	}

	synchronized public void put(int value) {
		contents = value;
	}
}






/* Versione SINCRONIZZATA */
/*
 * Commentare la classe sopra e scommentare questa e riprovare a compilare ed
 * eseguire il codice per vedere le differenze
 */

// public class CubbyHole {
// private int contents;
//
// private boolean available = false;
//
// public synchronized int get() {
// while (available == false) {
// try {
// wait();
// } catch (InterruptedException e) {
// }
// }
// available = false;
// notifyAll();
// return contents;
// }
//
// public synchronized void put(int value) {
// while (available == true) {
// try {
// wait();
// } catch (InterruptedException e) {
// }
// }
// contents = value;
// available = true;
// notifyAll();
// }
// }

Producer.java 2/4

[
top][prev][next]
/* Semplice classe d'esempio per mostrare la sincronizzazione
 * d'accesso in java. Questa classe si limita ad inserire 10 numeri da
 * 0 a 9 dentro un buffer CubbyHole */

public class Producer extends Thread {
    private CubbyHole cubbyhole;
    private int number;
    
    public Producer(CubbyHole c, int number) {
        cubbyhole = c;
        this.number = number;
    }

    public void run() {
        for (int i = 0; i < 10; i++) {
            cubbyhole.put(i);
            System.out.println("Producer #" + this.number
                               + " put: " + i);
            try {
                sleep((int)(Math.random() * 100));
            } catch (InterruptedException e) { }
        }
    }
}

Consumer.java 3/4

[
top][prev][next]
/* Semplice classe d'esempio per mostrare la sincronizzazione
 * d'accesso in java. Questa classe si limita a leggere da un buffer
 * CubbyHole 10 numeri da 0 a 9  */

public class Consumer extends Thread {
    private CubbyHole cubbyhole;
    private int number;
    public Consumer(CubbyHole c, int number) {
	cubbyhole = c;
	this.number = number;
    }
    public void run() {
	int value = 0;
	for (int i = 0; i < 10; i++) {
	    value = cubbyhole.get();
	    System.out.println("Consumer #" + this.number + " got: " + value);
	    try {
		sleep((int) (Math.random() * 100));
	    } catch (InterruptedException e) {
	    }
	}
    }
}

ProducerConsumerTest.java 4/4

[
top][prev][next]
/* Semplice main che dichiara e istanzia un buffer, un produttore e un
 * consumatore e fa partire i rispettivi thread */

public class ProducerConsumerTest {
    public static void main(String[] args) {
        CubbyHole c = new CubbyHole();
        Producer p1 = new Producer(c, 1);
        Consumer c1 = new Consumer(c, 1);

        p1.start();
        c1.start();
    }
}

Generated by GNU enscript 1.6.4.