私はグァバストライプロックを使用してリソースへのアクセスをロック提供したいです。例えば
Striped<Lock> keyLocks = Striped.lazyWeakLock(10)
Lock lock = keyLocks.get("resourceId")
// use lock...
私はどのようにのためにストライプの正しい数を選択するために、任意のガイドを見つけることができません。
Striped.lazyWeakLock(int stripes)
なければならないstripes
プロセッサコアまたは何の数にバインドしますか?
一般的な経験則なしには、それは同時実行レベルとメモリの消費量とのトレードオフに依存して、ありません。Striped
Javadocは、部分的にそれを説明します:
A縞模様
Lock/Semaphore/ReadWriteLock
。この申し出は、基礎となるロックと同様のストライピングConcurrentHashMap
再利用可能な形で、セマフォのためにそれを拡張し、読み書きロックを。概念的に、ロックストライピングは、多くのストライプにロックを分割する単一のロックの細分性を増加させ、代わりに単一のロックの競合を作成する、異なるストライプをロックし、同時に進行する独立した操作を可能にする技術です。このクラスによって提供される保証があれば同じキー、すなわち、同じロック(またはセマフォ)につながることがある
key1.equals(key2)
その後、striped.get(key1) == striped.get(key2)
(仮定がObject.hashCode()
正しくキーに実装されています)。場合は、そのノートkey1
に等しくない場合key2
、それはことを保証するものではありませんstriped.get(key1) != striped.get(key2)
。要素は、それにもかかわらず、同じロックにマッピングされている可能性があります。この出来事の確率が高く、ストライプの数低く。...
このクラスに先立ち、1は使用に誘惑されるかもしれない
Map<K, Lock>
、K
タスクを表します。これは、ユニークなロックにマッピングされた各一意のキーを持つことによって同時実行性を最大化するだけでなく、メモリ・フットプリントを最大化します。他の極端では、1はメモリフットプリントを最小限に抑えるだけでなく、同時実行性を最小限に抑え、すべてのタスクのための単一のロックを、使用することができます。代わりに、いずれかのこれらの両極端の選択のため、Striped
ユーザーは必要な同時実行性とメモリフットプリントとの間で取引することができます。例えば、一連のタスクがCPUバウンドであれば、人は簡単、非常にコンパクトな作成することができますStriped<Lock> of availableProcessors() * 4
で作成することができ、ロックの可能性の何千ものではなく、ストライプをMap<K, Lock>
構成。
換言すれば、Striped
それらのハッシュコードに基づいて、キーの間に分布しているロックの数を選択するための柔軟性を提供します。場合は、そのキー不変を維持しながらこれは、動的に並行処理とメモリフットプリントの間のトレードオフを適用することができますkey1.equals(key2)
、その後、striped.get(key1) == striped.get(key2)
。