java并发-带有监视器线程的单例设计

标签 java multithreading design-patterns concurrency singleton

因此我有一个单例类

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 可以解决问题吗?

最佳答案

正如 user2677485 所提到的,您应该使用 ThreadLocal 并实现initialValue 方法。另一点是Handler的实现应该实现finalize方法,这样当它被GC回收时,这个方法就会被调用,你可以清理你的资源。

代码可以简化为如下所示:

public class HandlerCache {

   private static final handlers = new ThreadLocal<Handler>() {
        protected Handler initializeValue() {
              return HandlerFactory.get(...);
        }
   };

   public static Handler getHandler() {
        return handlers.get();
   }

}

关于java并发-带有监视器线程的单例设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960750/

相关文章:

c - pthread_mutex_lock() 上的段错误

c++ - Boost 线程和定时器,C++

java - 如何创建具有根据唯一键生成的属性的对象

c++ - 在 C++ 中确保单个实例但不是全局实例的最佳方法

java - 从字符串转换为整数时丢失前导 "0"零

java - 如何使内部 Java 包在 Eclipse 中可访问?

java - 不确定为什么我的实例出现错误

java - 如何在lucene中索引日期字段

c++ - 检查 16 个容器中是否存在值

java - 对两个相同但具有两种不同功能的对象进行建模的好方法是什么?