2016-09-10 3 views
1

私はしばらく質問の周りを頭で掻いてきました。私は周りを見回しましたが、答えを見つけることに失敗しました。 concurrencyLevelがマップのcapacityより大きい場合、どうなるかを知りたいと思います。concurrencyLevelがConcurrentHashMapの容量よりも大きい場合はどうなりますか?

デフォルトでは両方とも16です。つまり、各バケットにロックが設定されます。 capacityが32、concurrencyLevel 16の場合、ロックは2つのバケットに保持されます。しかし、concurrencyLevelが32でcapacityが16の場合はどうなりますか?

各バケットは2つのロックで保持されますが、concurrencyLevelcapacityの分布が24,16などのように不均一な場合はどうなりますか?

+0

:Javaの1.8では、それは、次の2行をcontanis既に投稿にコメントした人にタグを付けることができるように。 – rd22

+0

それは何のためのタグなのか、@pingsのコメントです。 – EJP

+0

ええ!しかし、彼らは質問にコメントをしなくても、SOコミュニティの誰にでもタグを付けることができますか? @olegはこの作業を行いますか? – rd22

答えて

5

何も起こりません。 ConcurrentHashMapの文書をチェックしましたか? 「このクラスの以前のバージョンとの互換性のために、コンストラクタは、内部サイジングのヒントとして、concurrencyLevelをオプションで指定することもできます」というヒントです。さらにconcurrencyLevel: "同時に更新されるスレッドの推定数。インプリメンテーションでは、この値をサイジングヒントとして使用できます。だから何か起これば、サイズは違う。多分。

詳細な実装の詳細については、ソースコードを参照してください。それは利用可能です。 、私はSO、Quoraのに似ていますが、より洗練された機能を使用すると、即時応答を得るようにあなたは知っている人が答えを持っているでしょうタグ付けする機能を持っていた希望の回で

if (initialCapacity < concurrencyLevel) // Use at least as many bins 
     initialCapacity = concurrencyLevel; // as estimated threads 
+0

これは意味があります。私はソースから検証しましたが、私はJava 7で作業していましたが、Java 7ではあまりにも多くの内部変数を使用していました。何か似たようなJava 7が起こりますか? – rd22

関連する問題