code: public SymbolTable makeChild()
      {
          final boolean internStrings;
          final String[] symbols;
          final Bucket[] buckets;
          final int size;
          final int sizeThreshold;
          final int indexMask;
          final int version;
  
          synchronized (this) {      
              internStrings = mInternStrings;
              symbols = mSymbols;
              buckets = mBuckets;
              size = mSize;
              sizeThreshold = mSizeThreshold;
              indexMask = mIndexMask;
              version = mThisVersion+1;
          }
          return new SymbolTable(internStrings, symbols, buckets,
                  size, sizeThreshold, indexMask, version);
      }
docs: "Factory" method; will create a new child instance of this symbol
  table. It will be a copy-on-write instance, ie. it will only use
  read-only copy of parent's data, but when changes are needed, a
  copy will be created.
  <p>
  Note: while data access part of this method is synchronized, it is
  generally not safe to both use makeChild/mergeChild, AND to use instance
  actively. Instead, a separate 'root' instance should be used
  on which only makeChild/mergeChild are called, but instance itself
  is not used as a symbol table.