SharedCell.java

Show multiple threads modifying shared object.

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

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

ProduceInteger.java

public class ProduceInteger extends Thread {
   private HoldIntegerUnsynchronized pHold;

   public ProduceInteger( HoldIntegerUnsynchronized 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 HoldIntegerUnsynchronized cHold;

   public ConsumeInteger( HoldIntegerUnsynchronized 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() );
   }
}

HoldIntegerUnsychronized

public class HoldIntegerUnsynchronized {
   private int sharedInt = -1;

   public void setSharedInt( int val )
   {
      System.out.println( Thread.currentThread().getName() +
         " setting sharedInt to " + val );
      sharedInt = val;
   }

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

Output

ConsumeInteger retrieving sharedInt value -1
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
ProduceInteger setting sharedInt to 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
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: 37
Terminating ConsumeInteger


Maintained by John Loomis, last updated 15 June 2000