public class FSTClazzInfoRegistry { ... ... public FSTClazzInfo getCLInfo(Class c) { //1).此处会出现死循环,而且线程一直是运行状态 while(!rwLock.compareAndSet(false,true)); FSTClazzInfo res = (FSTClazzInfo) mInfos.get(c); if ( res == null ) { if ( c == null ) { rwLock.set(false); throw new NullPointerException("Class is null"); } //2).在构造FSTClazzInfo对象时会抛出运行时异常,一旦抛出异常造成代码1处死循环 res = new FSTClazzInfo(c, this, ignoreAnnotations); mInfos.put( c, res ); } rwLock.set(false); return res; } ... ...}public final class FSTClazzInfo { ... ... public FSTClazzInfo(Class clazz, FSTClazzInfoRegistry infoRegistry, boolean ignoreAnnotations) { this.clazz = clazz; enumConstants = clazz.getEnumConstants(); reg = infoRegistry; ignoreAnn = ignoreAnnotations; createFields(clazz); if ( !reg.isStructMode() ) { if (Externalizable.class.isAssignableFrom(clazz)) { externalizable = true; cons = FSTUtil.findConstructorForExternalize(clazz); } else if (Serializable.class.isAssignableFrom(clazz) || clazz == Object.class ) { externalizable = false; cons = FSTUtil.findConstructorForSerializable(clazz); } else { //3).一旦需要序列化的对象没有实现Serializable接口或Externalizable接口的话,就会抛出运行时异常 throw new RuntimeException("Class "+clazz.getName()+" does not implement Serializable or externalizable"); } if ( ! ignoreAnnotations ) { Predict annotation = (Predict) clazz.getAnnotation(Predict.class); if (annotation != null) { predict = annotation.value(); } else { //default predictions (disabled, no speedup)// if ( clazz == List.class ) {// predict = new Class[]{ArrayList.class};// } else if ( clazz == Map.class ) {// predict = new Class[]{HashMap.class};// } } equalIsIdentity = clazz.isAnnotationPresent(EqualnessIsIdentity.class); equalIsBinary = clazz.isAnnotationPresent(EqualnessIsBinary.class); flat = clazz.isAnnotationPresent(Flat.class); } } if (cons != null) { cons.setAccessible(true); } final String name = clazz.getName(); if (name.length()<127) { isAsciiNameShortString = true; for (int i=0; i < name.length();i++) { if (name.charAt(i) > 127) { isAsciiNameShortString = false; break; } } } requiresInit = isExternalizable() || useCompatibleMode() || hasTransient; } ... ...}