2017-11-14 9 views
0

spring-cloud-netflix-coreライブラリを使用している状況があります。このライブラリはhereと記載されています。問題はCachingSpringLoadBalancerFactoryConcurrentReferenceHashMapを使用していて、報告されている方法がhereであると思います。
も(ソフト参照を使用しています)ConcurrentReferenceHashMapのドキュメントから:ConcurrentReferenceHashMapはどのように機能しますか?

参照の使用は、マップに配置アイテムが、その後利用可能になるという保証がないことを意味します。ガベージコレクタはいつでも参照を破棄することがあるため、未知のスレッドが黙ってエントリを削除しているように見えることがあります。

私の質問は次のとおりです。
1.私の理解は間違いありませんか?

// Original code is in CachingSpringLoadBalancerFactory in spring-cloud-netflix-core 
// cache is a field of type ConcurrentReferenceHashMap 
if (this.cache.containsKey(clientName)) { 
    return this.cache.get(clientName); // This can be null, right? 
} 

2.それのためのテストケースを書くためにとにかくがあります。限られたメモリを持つスタンドアロンアプリケーション(-Xmx50m)で一度再現することができました。しかし、このようなシナリオをカバーするために、どのように単体テストを書くことができますか?

答えて

0

ご質問のとおり、はい、正しいです。一般に、これはドキュメントに記載されているように、WeakHashMapのバリエーションです。

WeakHashMapのJavaDocは言う:。

WeakHashMapクラスの振る舞いがあるので、使い慣れたので、いくつかの(必須ではありませんが)Map不変量は、このクラスのために保有していないガベージコレクタのアクションに部分的に依存ガベージコレクタはいつでもキーを破棄することがありますが、WeakHashMapは、未知のスレッドが黙ってエントリを削除しているかのように振る舞います。特にWeakHashMapインスタンスで同期してそのミューテータメソッドを呼び出さなくても、sizeメソッドisEmptyメソッドがfalseを返し、次にを返すように、時間の経過と共に小さな値を返す、containsKey方法は、put方法がためfalseを返すようにnullremove方法を返すようにするために、指定されたキーの値を返すが、後nullを返すget方法のために、指定されたキーのtrue以降falseを戻します以前にマップに登場していたキーと、キーセット、バリューコレクション、および連続してより少数の要素を生成するエントリセットの逐次検査のために使用されました。

この現象のため、テストすることは非常に困難です。マップのgetReference()メソッドと対応する要素のrelease()メソッドを使用して、一部の不変条件をテストする場合にパージをシミュレートできます。

関連する問題