4
4
5
5
class Test {
6
6
public final Object lock = new Object ();
7
-
7
+
8
8
public volatile boolean aField = true ;
9
-
9
+
10
10
public synchronized void bad1 (Resource r ) {
11
11
// probably used concurrently due to synchronization
12
12
if (r .getState ()) {
13
- r .act ();
13
+ r .act (); // $ Alert
14
14
}
15
15
}
16
16
17
17
public synchronized void bad2 (Resource2 r ) {
18
18
// probably used concurrently due to synchronization
19
19
if (r .getState ()) {
20
- r .act ();
20
+ r .act (); // $ Alert
21
21
}
22
22
}
23
23
24
24
public void bad3 (Resource r ) {
25
25
// probably used concurrently due to use of volatile field
26
26
if (r .getState () && aField ) {
27
- r .act ();
27
+ r .act (); // $ Alert
28
28
}
29
29
}
30
30
31
31
public void bad4 (Resource r ) {
32
32
// probably used concurrently due to synchronization
33
33
synchronized (this ) {
34
34
if (r .getState () && aField ) {
35
- r .act ();
35
+ r .act (); // $ Alert
36
36
}
37
37
}
38
38
}
39
-
39
+
40
40
public void good1 (Resource r ) {
41
41
// synchronizes on the same monitor as the called methods
42
42
synchronized (r ) {
@@ -45,15 +45,15 @@ public void good1(Resource r) {
45
45
}
46
46
}
47
47
}
48
-
48
+
49
49
public Resource rField = new Resource ();
50
-
50
+
51
51
public void someOtherMethod () {
52
52
synchronized (lock ) {
53
53
rField .act ();
54
54
}
55
55
}
56
-
56
+
57
57
public void good2 () {
58
58
// r is always guarded with the same lock, so okay
59
59
synchronized (lock ) {
@@ -77,43 +77,43 @@ public void good3(Resource r) {
77
77
r .act ();
78
78
}
79
79
}
80
-
80
+
81
81
class Resource {
82
82
boolean state ;
83
-
83
+
84
84
public synchronized void setState (boolean newState ) {
85
85
this .state = newState ;
86
86
}
87
-
87
+
88
88
public synchronized boolean getState () {
89
89
return state ;
90
90
}
91
-
91
+
92
92
public synchronized void act () {
93
93
if (state )
94
94
sideEffect ();
95
95
else
96
96
sideEffect ();
97
97
}
98
-
98
+
99
99
public void sideEffect () { }
100
100
}
101
101
102
102
class Resource2 {
103
103
boolean state ;
104
-
104
+
105
105
public void setState (boolean newState ) {
106
106
synchronized (this ) {
107
107
this .state = newState ;
108
108
}
109
109
}
110
-
110
+
111
111
public boolean getState () {
112
112
synchronized (this ) {
113
113
return state ;
114
114
}
115
115
}
116
-
116
+
117
117
public void act () {
118
118
synchronized (this ) {
119
119
if (state )
@@ -122,7 +122,7 @@ public void act() {
122
122
sideEffect ();
123
123
}
124
124
}
125
-
125
+
126
126
public void sideEffect () { }
127
127
}
128
128
}
0 commit comments