1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
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();
}
}
|