| // Test that monitor locks work and are recursive. |
| |
| class T implements Runnable |
| { |
| public int count = 0; |
| Counter c; |
| |
| public T (Counter c) |
| { |
| this.c = c; |
| } |
| |
| public void run() |
| { |
| while (true) |
| { |
| // NOTE: double-synchronization here. |
| synchronized (c) |
| { |
| if (c.getCount() <= 100000) |
| count++; |
| else |
| break; |
| } |
| } |
| } |
| } |
| |
| class Counter |
| { |
| int i = 0; |
| public synchronized int getCount () |
| { |
| return ++i; |
| } |
| } |
| |
| public class Thread_Monitor |
| { |
| public static void main(String args[]) |
| { |
| Counter c = new Counter(); |
| T t1 = new T(c); |
| T t2 = new T(c); |
| |
| Thread th1 = new Thread(t1); |
| Thread th2 = new Thread(t2); |
| th1.start(); |
| th2.start(); |
| try |
| { |
| th1.join(); |
| th2.join(); |
| } |
| catch (InterruptedException x) |
| { |
| System.out.println("failed: Interrupted"); |
| } |
| if (t1.count + t2.count == 100000) |
| System.out.println ("ok"); |
| else |
| System.out.println ("failed: total count incorrect"); |
| } |
| } |