public override V GetExtension(ConversionKey key)
        {
            Object extension = this.classEntry.Get(key);

            if (extension == null)
            {
                Object writeLock = GetWriteLock();
                lock (writeLock)
                {
                    extension = this.classEntry.Get(key);
                    if (extension == null)
                    {
                        ClassTupleEntry <V> classEntry = CopyStructure();

                        classEntry.Put(key, alreadyHandled);
                        classEntry.typeToDefEntryMap.Put(key, alreadyHandled);
                        CheckToWeakRegisterExistingExtensions(key, classEntry);
                        this.classEntry = classEntry;

                        extension = classEntry.Get(key);
                        if (extension == null)
                        {
                            return(default(V));
                        }
                    }
                }
            }
            if (Object.ReferenceEquals(extension, alreadyHandled))
            {
                // Already tried
                return(default(V));
            }
            return((V)extension);
        }
        protected void TypeToDefEntryMapChanged(ClassTupleEntry <V> classEntry, ConversionKey key)
        {
            Object obj = classEntry.typeToDefEntryMap.Get(key);

            if (obj == null)
            {
                classEntry.Remove(key);
                return;
            }
            if (obj == alreadyHandled)
            {
                classEntry.Put(key, alreadyHandled);
                return;
            }
            if (obj is Def2Entry <V> )
            {
                classEntry.Put(key, ((Def2Entry <V>)obj).extension);
                return;
            }
            Def2Entry <V> firstDefEntry = ((InterfaceFastList <Def2Entry <V> >)obj).First.ElemValue;

            classEntry.Put(key, firstDefEntry.extension);
        }