多线程对象→Java中的对象缓存映射?

Kev*_*eid 4 java collections multithreading caching

我想要一个Java集合:

  • 将任意Objects 映射到Objects(不是String或仅限于受限制的键)
  • 将用作缓存; 如果密钥不在缓存中,则将计算一个值(不必将其构建到集合中)
  • 将同时从多个线程访问
  • 将永远不会从中删除项目
  • 必须非常有效地阅读(缓存命中); 写入效率不一定(缓存未命中)

如果在多个线程中同时缓存未命中导致冗余计算,则可以.典型的情况是缓存首先由一个线程填充.

synchronized围绕线程安全哈希表块失败的有效阅读的标准.线程局部缓存很简单,但意味着新线程很昂贵,因为它们具有缓存的完整副本.

我们可以将Java 1.5内置函数或一个或多个类文件复制到我们的MIT许可项目中,而不是大型外部库.

Mar*_*tin 7

使用java并发hashmap

ConcurrentHashMap<object, object> table;

public object getFromCache(object key)
{
    value = table.get(key);

    if (value == null)
    {
        //key isn't a key into this table, ie. it's not in the cache
        value = calculateValueForKey(key)
        object fromCache = table.putIfAbsent(key, value);
    }

    return value;
}

/**
* This calculates a new value to put into the cache
*/
public abstract object calculateValueForKey(object key);
Run Code Online (Sandbox Code Playgroud)

Nb这不再是多线程缓存的一般解决方案,因为它依赖于所声明的事物,即对象是不可变的,因此对象等价并不重要.