Sto studiando il modello produttori - Consumatori utilizzabdo i threads.
Questo esempio trovato in rete permette che un consumatore(lettore) prelevi il dato prima che il produttore lo aggiorni.
Quindi alcune volte il consumatore riesce a leggere il dato prima che sia stato agggiornato, e questo dovrebbe essere impedito da "private boolean available = false;"
A me serve che questo non debba prorpio accadere.

il codice:

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

/////////////////////////////////////////////////////

	class CubbyHole {		//	Può capitare che il consumatore consumi prima che il produttore produca  !!!! 
	   
	   private int contents;
	   private int c=4;
	   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();
	   }
	}
	
/////////////////////////////////////////////////////
	
	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 + " get: " + value);
	         }
	   }
	}
	
/////////////////////////////////////////////////////
	
	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() * 10));
				} catch (InterruptedException e) { }
			}
		}
	}