-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
6u24
-
x86
-
linux
FULL PRODUCT VERSION :
java -version git:master
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux HOSTNAME 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux
EXTRA RELEVANT SYSTEM CONFIGURATION :
not relevant
A DESCRIPTION OF THE PROBLEM :
The private method initAnnotationsIfNecessary, called every time annotations are being retrieved from the Class object, is synchronized on the class instance.
Any static synchronized method in a class also synchronizes on the class instance.
This means that any static synchronized method on a class might cause deadlocks.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Try to retrieve annotations on a class while another thread is holding the class lock, perhaps via a static synchronized method. See the submitted sample code.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
[Ljava.lang.annotation.Annotation;@<hashcode>
ACTUAL -
deadlock
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.concurrent.*;
public class Deadlock {
public static synchronized void main(String[] args) throws Exception {
Callable<Object> c = new Callable<Object>() {
@Override
public Object call() throws Exception {
return SyncBug.class.getAnnotations();
}
};
Future<Object> future = Executors.newSingleThreadExecutor().submit(c);
System.out.println(future.get());
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Don't ever use static synchronized methods or syncronize on the class.
java -version git:master
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux HOSTNAME 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux
EXTRA RELEVANT SYSTEM CONFIGURATION :
not relevant
A DESCRIPTION OF THE PROBLEM :
The private method initAnnotationsIfNecessary, called every time annotations are being retrieved from the Class object, is synchronized on the class instance.
Any static synchronized method in a class also synchronizes on the class instance.
This means that any static synchronized method on a class might cause deadlocks.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Try to retrieve annotations on a class while another thread is holding the class lock, perhaps via a static synchronized method. See the submitted sample code.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
[Ljava.lang.annotation.Annotation;@<hashcode>
ACTUAL -
deadlock
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.concurrent.*;
public class Deadlock {
public static synchronized void main(String[] args) throws Exception {
Callable<Object> c = new Callable<Object>() {
@Override
public Object call() throws Exception {
return SyncBug.class.getAnnotations();
}
};
Future<Object> future = Executors.newSingleThreadExecutor().submit(c);
System.out.println(future.get());
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Don't ever use static synchronized methods or syncronize on the class.
- duplicates
-
JDK-7122142 (ann) Race condition between isAnnotationPresent and getAnnotations
-
- Closed
-