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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
import org.checkerframework.checker.lock.qual.*;
public class Fields {
class MyClass {
public Object field;
}
static @GuardedBy("Fields.class") MyClass lockedStatically;
static synchronized void ssMethod() {
lockedStatically.field = new Object();
}
@GuardedBy("lockingObject") MyClass locked;
final Object lockingObject = new Object();
synchronized void wrongLock1() {
// locking over wrong lock
// :: error: (lock.not.held)
locked.field = new Object(); // error
}
synchronized void wrongLock2() {
// locking over wrong lock
synchronized (this) {
// :: error: (lock.not.held)
locked.field = new Object(); // error
}
}
void rightLock() {
synchronized (lockingObject) {
locked.field = new Object();
}
// accessing after the synchronized object
// :: error: (lock.not.held)
locked.field = new Object(); // error
}
@Holding("lockingObject")
void usingHolding() {
locked.field = new Object();
}
@GuardedBy("this") MyClass lockedByThis;
void wrongLocksb() {
// without locking
// :: error: (lock.not.held)
lockedByThis.field = new Object(); // error
synchronized (Fields.class) {
// :: error: (lock.not.held)
lockedByThis.field = new Object(); // error
}
}
void rightLockb() {
synchronized (this) {
lockedByThis.field = new Object();
}
// accessing after the synchronized object
// :: error: (lock.not.held)
lockedByThis.field = new Object(); // error
}
synchronized void synchronizedMethodb() {
lockedByThis.field = new Object();
}
void test() {
// synchronized over the right object
final Fields a = new Fields();
final Fields b = new Fields();
synchronized (this) {
lockedByThis.field = new Object();
// :: error: (lock.not.held)
a.lockedByThis.field = new Object(); // error
// :: error: (lock.not.held)
b.lockedByThis.field = new Object(); // error
}
synchronized (a) {
// :: error: (lock.not.held)
lockedByThis.field = new Object(); // error
a.lockedByThis.field = new Object();
// :: error: (lock.not.held)
b.lockedByThis.field = new Object(); // error
}
synchronized (b) {
// :: error: (lock.not.held)
lockedByThis.field = new Object(); // error
// :: error: (lock.not.held)
a.lockedByThis.field = new Object(); // error
b.lockedByThis.field = new Object();
}
}
}
|