| import org.checkerframework.checker.lock.qual.GuardedBy; |
| |
| public class NestedSynchronizedBlocks { |
| class MyClass { |
| public Object field; |
| } |
| |
| @GuardedBy("lock1") MyClass m1; |
| |
| @GuardedBy("lock2") MyClass m2; |
| |
| @GuardedBy("lock3") MyClass m3; |
| |
| @GuardedBy("lock4") MyClass m4; |
| |
| final Object lock1 = new Object(), |
| lock2 = new Object(), |
| lock3 = new Object(), |
| lock4 = new Object(); |
| |
| void foo() { |
| synchronized (lock1) { |
| synchronized (lock2) { |
| synchronized (lock3) { |
| synchronized (lock4) { |
| } |
| } |
| } |
| } |
| |
| // Test that the locks are known to have been released. |
| |
| // :: error:(lock.not.held) |
| m1.field = new Object(); |
| // :: error:(lock.not.held) |
| m2.field = new Object(); |
| // :: error:(lock.not.held) |
| m3.field = new Object(); |
| // :: error:(lock.not.held) |
| m4.field = new Object(); |
| } |
| } |