SharedCell.java

Show multiple threads modifying shared object.

public class SharedCell {
   public static void main( String args[] )
   {
      HoldIntegerSynchronized h =
         new HoldIntegerSynchronized();
      ProduceInteger p = new  ProduceInteger( h );
      ConsumeInteger c = new  ConsumeInteger( h );

      p.start();
      c.start();
   }
}

ProduceInteger.java

public class ProduceInteger extends Thread {
   private HoldIntegerSynchronized pHold;

   public ProduceInteger( HoldIntegerSynchronized h )
   {
      super( "ProduceInteger" );
      pHold = h;
   }

   public void run()
   {
      for ( int count = 1; count <= 10; count++ ) {
         // sleep for a random interval
         try {
            Thread.sleep( (int) ( Math.random() * 3000 ) );
         }
         catch( InterruptedException e ) {
            System.err.println( e.toString() );
         }

         pHold.setSharedInt( count );
      }

      System.out.println( getName() +
         " finished producing values" +
         "\nTerminating " + getName() );
   }
}

ConsumeInteger.java

public class ConsumeInteger extends Thread {
   private HoldIntegerSynchronized cHold;

   public ConsumeInteger( HoldIntegerSynchronized h )
   {
      super( "ConsumeInteger" );
      cHold = h;
   }

   public void run()
   {
      int val, sum = 0;

      do {
         // sleep for a random interval
         try {
            Thread.sleep( (int) ( Math.random() * 3000 ) );
         }
         catch( InterruptedException e ) {
            System.err.println( e.toString() );
         }

         val = cHold.getSharedInt();
         sum += val;
      } while ( val != 10 );

      System.out.println(
         getName() + " retrieved values totaling: " + sum +
         "\nTerminating " + getName() );
   }
}

HoldIntegerSychronized.java

Definition of class HoldIntegerSynchronized that uses thread synchronization to ensure that both threads access sharedInt at the proper times.

public class HoldIntegerSynchronized {
   private int sharedInt = -1;
   private boolean writeable = true;  // condition variable

   public synchronized void setSharedInt( int val )
   {
      while ( !writeable ) {  // not the producer's turn
         try {
            wait();  
         }
         catch ( InterruptedException e ) {
            e.printStackTrace();
         }
      }

      System.out.println( Thread.currentThread().getName() +
         " setting sharedInt to " + val );
      sharedInt = val;

      writeable = false;
      notify();  // tell a waiting thread to become ready
   }

   public synchronized int getSharedInt()
   {
      while ( writeable ) {   // not the consumer's turn
         try {
            wait();
         }
         catch ( InterruptedException e ) {
            e.printStackTrace();
         }
      }

      writeable = true;
      notify();  // tell a waiting thread to become ready

      System.out.println( Thread.currentThread().getName() +
         " retrieving sharedInt value " + sharedInt );
      return sharedInt;
   }
}

Output

ProduceInteger setting sharedInt to 1
ConsumeInteger retrieving sharedInt value 1
ProduceInteger setting sharedInt to 2
ConsumeInteger retrieving sharedInt value 2
ProduceInteger setting sharedInt to 3
ConsumeInteger retrieving sharedInt value 3
ProduceInteger setting sharedInt to 4
ConsumeInteger retrieving sharedInt value 4
ProduceInteger setting sharedInt to 5
ConsumeInteger retrieving sharedInt value 5
ProduceInteger setting sharedInt to 6
ConsumeInteger retrieving sharedInt value 6
ProduceInteger setting sharedInt to 7
ConsumeInteger retrieving sharedInt value 7
ProduceInteger setting sharedInt to 8
ConsumeInteger retrieving sharedInt value 8
ProduceInteger setting sharedInt to 9
ConsumeInteger retrieving sharedInt value 9
ProduceInteger setting sharedInt to 10
ProduceInteger finished producing values
Terminating ProduceInteger
ConsumeInteger retrieving sharedInt value 10
ConsumeInteger retrieved values totaling: 55
Terminating ConsumeInteger


Maintained by John Loomis, last updated 15 June 2000