CIS 260 Synchronized Code Blocks

Instead of synchronizing entire methods, we can synchronize specific blocks of critical code. This example works well! The shared resources don't show sync conflicts and neither method is blocked for long. You have to provide an object reference to synchronize code blocks.

public class TThread8 {
   public static void main(String[] args) {
      Adder t = new Adder();
      t.start();
      (new TestSync(t)).start();
      t = null;
   }
}

class Adder extends Thread {
   private int count1 = 0, count2 = 0, count3 = 0;
   private boolean done = false;
   private String[] sym = { "-", "\\", "|", "/" };

   public void run() {
      while (count1 <= 100) {
         synchronized(this) {
            count1++; count2++; count3++;
         }
         System.out.print("\r" + sym[count1 % 4]);
         try {
            Thread.sleep(50);
         } catch (InterruptedException e) {
            System.out.println("Application Interrupted");
         }
      }
      done = true;
   }

   public boolean check() {
      int c1, c2, c3;
      synchronized(this) {
         c1 = count1; c2 = count2; c3 = count3;
      }
      if ((c1 != c2) || (c2 != c3))
         System.out.println("\rNot synced: " + c1 +
                            ", " + c2 + ", " + c3);
      return !done;
   }
}

class TestSync extends Thread {
   private int totAccess = 0;
   private Adder t1 = null;

   public TestSync(Adder t) { t1 = t; }

   public void run() {
      while (t1.check()) ++totAccess;
      System.out.println("\nTotal sync accesses: " + totAccess);
   }
}
// \
// Total sync accesses: 16127796

Previous: syncronized methods

Next: reentrant lock