aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/javassist/CtClassType.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/javassist/CtClassType.java')
-rw-r--r--src/main/javassist/CtClassType.java25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/main/javassist/CtClassType.java b/src/main/javassist/CtClassType.java
index ae196c4a..959ec302 100644
--- a/src/main/javassist/CtClassType.java
+++ b/src/main/javassist/CtClassType.java
@@ -179,6 +179,7 @@ class CtClassType extends CtClass {
}
public ClassFile getClassFile3(boolean doCompress) {
+ // quick path - no locking
ClassFile cfile = classfile;
if (cfile != null)
return cfile;
@@ -186,17 +187,29 @@ class CtClassType extends CtClass {
if (doCompress)
classPool.compress();
- if (rawClassfile != null) {
+ byte[] rcfile;
+ synchronized (this) {
+ // repeat under lock to make sure we get a consistent result (classfile might have been set by another thread)
+ cfile = classfile;
+ if (cfile != null)
+ return cfile;
+
+ rcfile = rawClassfile;
+ }
+
+ if (rcfile != null) {
+ final ClassFile cf;
try {
- ClassFile cf = new ClassFile(new DataInputStream(
- new ByteArrayInputStream(rawClassfile)));
- rawClassfile = null;
- getCount = GET_THRESHOLD;
- return setClassFile(cf);
+ cf = new ClassFile(new DataInputStream(new ByteArrayInputStream(rcfile)));
}
catch (IOException e) {
throw new RuntimeException(e.toString(), e);
}
+ getCount = GET_THRESHOLD;
+ synchronized (this) {
+ rawClassfile = null;
+ return setClassFile(cf);
+ }
}
InputStream fin = null;