RFR 8005704: Update ConcurrentHashMap to v8

Doug Lea dl at cs.oswego.edu
Wed May 29 13:11:30 UTC 2013

On 05/28/13 15:07, Mike Duigou wrote:
> Hi Chris & Doug;

> - I don't see the advantage to exposing the ConcurrentHashMap.KeySetView type
> particularly for newKeySet(). Why not return Set<K>? The additional methods
> don't seem to offer much that's desirable for the newKeySet() case.

Since we don't have a ConcurrentSet interface, people are reduced to
instanceof checks to see if they have a concurrent one. But without
exposing the class, they couldn't even do this, so complained. This
will arise more frequently with  j.u.streams.Collectors.

> - I am reluctant to deprecate contains(Object) here unless we deprecate it in
> Hashtable as well. I recognize that this has been a source of errors
> (https://issues.apache.org/bugzilla/show_bug.cgi?id=48755 for one example).
> Is it time to deprecate it there as well?

Sure, but why bother. Anyone still using Hashtable is not going to care
if they get more deprecation warnings :-)

> - I think there could be more complete description of the
> parallelismThreshold and interaction with common pool. i.e. does "maximal
> parallelism" mean one thread per element or "size() /
> getCommonPoolParallelism()". Some advice for choosing in-between values would
> be good unless "1" is the best advice for cases where you just don't know. It
> would be a shame to see people shooting themselves in the foot with this.

Changed to:

  * <p>These bulk operations accept a {@code parallelismThreshold}
  * argument. Methods proceed sequentially if the current map size is
  * estimated to be less than the given threshold. Using a value of
  * {@code Long.MAX_VALUE} suppresses all parallelism.  Using a value
  * of {@code 1} results in maximal parallelism by partitioning into
  * enough subtasks to utilize all processors. Normally, you would
  * initially choose one of these extreme values, and then measure
  * performance of using in-between values that trade off overhead
  * versus throughput. Parallel forms use the {@link
  * ForkJoinPool#commonPool()}.

I'd rather not explicitly mention here any particular values for people
to try, since any number we might put is likely to be misused.
Sometime, we should write up a little how-to document about
tuning parallelism separately.


More information about the core-libs-dev mailing list