CIS 260 Synchronized MethodsOne possibility for solving our shared resource problem is to synchronize the methods that access the critical memory locations. Synchronizing the methods means that once one synchronized method starts executing, other synchronized methods are off limits until the executing synchronized method is finished. public class TThread7 { 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 synchronized void run() { while (count1 <= 100) { 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 synchronized boolean check() { int 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: 0 Well, that wasn't very satisfying. Once the run() method in Adder started, it blocked the check() method from executing. The call to sleep() does not allow other methods to execute. It just takes time. The check() method never got a chance to execute. We're back to blocking resources. |