public <C, P> V create(final K key, final MapCallback<K, V, C, P> valueCreator, final C context,
      final P createParams, final boolean lockForRead) {
    // throws NullPointerException if key null
    final int hash = entryCreator.keyHashCode(key, compareValues);
    return segmentFor(hash).create(key, hash, valueCreator, context, createParams, lockForRead);
  }
Like {@link #putIfAbsent(Object, Object)} but creates the value only if none present rather
than requiring a passed in pre-created object that may ultimately be thrown away. Also takes
read lock on the segment, if required, to provide better guarantees w.r.t. remove/replace that
checks against old value when the value may be changed structurally by reading (e.g. a list as
value changed after a call to this method).

@param key key with which the specified value is to be associated
@param valueCreator factory object to create the value to be associated with the specified key,
       if required
@param context the context in which this method has been invoked and passed to
       <code>valueCreator</code> {@link MapCallback#newValue} method to create the new instance
@param createParams parameters to be passed to the <code>valueCreator</code>
       {@link MapCallback#newValue} method to create the new instance
@param lockForRead if passed as true, then the read from the map prior to creation is done
       under the segment read lock; this provides better guarantees with respect to other
       threads that may be manipulating the value object in place after reading from the map

@return the previous value associated with the specified key, or the new value obtained by
        invoking {@link MapCallback#newValue} if there was no mapping for the key; this is
        paired with the segment read lock

@throws NullPointerException if the specified key or value is null
geode-core/src/main/java/org/apache/geode/internal/util/concurrent/CustomEntryConcurrentHashMap.java