とシングルトンデザイン私は、コンストラクタが終了する前に、私は、監視スレッドにシングルトンインスタンスをリークしていますので、Javaの同時実行 - 監視スレッド
public final class HandlerCache {
//the cache maintains a handler per thread
private final Map<Thread, Handler> cache = new ConcurrentHashMap<>();
private final Thread monitor;
private static final HandlerCache INSTANCE = new HandlerCache();
private HandlerCache() {
monitor = new Thread() {
//periodically monitor cache and close handlers when a thread has died
}
monitor.start()
}
public static HandlerCache getInstance() {
return INSTANCE;
}
public Handler getHandler() throws Exception {
final Thread thread = Thread.currentThread();
Handler handler = cache.get(thread);
if (!(handler == null))
return handler;
handler = HandlerFactory.get(getHandlerFromName(thread.getName()));
cache.put(thread, handler);
return handler;
}
}
シングルトンクラスを持って、より良い方法は何ですか?
キャッシュをvolatileにすると問題が解決されますか?
代わりにあなたのキャッシュのThreadLocalのを使用しない任意の理由? (サイドノート:あなたの実装はスレッドセーフではありません) – assylias
返信いただきありがとうございます。スレッドが終了したときにハンドラを閉じるために、ThreadLocalの場合はスレッドとハンドライベントの間のマッピングを維持する必要があります。スレッドクラスは、スレッドが停止する前に呼び出されるフックを提供しません。スレッド安全性の問題を説明してください。完全に構築される前にオブジェクトがモニタスレッドに表示されていることがわかります。この質問のため – user2677485
getHandlerメソッドはアトミックではありません。そのため、同じスレッドで工場が1回以上呼び出される可能性があります。問題があるかどうかは不明です(ファクトリの実装では友達)。 – assylias