首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最少阻塞java缓存

最少阻塞java缓存
EN

Stack Overflow用户
提问于 2015-01-30 19:08:28
回答 1查看 646关注 0票数 3

假设我们要为特定实体实现缓存。

代码语言:javascript
复制
class Cache {
    private static Map<String, Object> cache = new HashMap<>();

    public static Object get(String id) {
        assert notNullOrEmpty(id);
        return cache.get(id);
    }

    public static Object add(String id, Object element) {
        assert notNullOrEmpty(id) && notNull(element);

        if(cache.containsKey(id)) return cache.get(id);

        cache.put(id, element);
        return element;
    }
}

现在,我们希望确保这是线程安全,最重要的是,当涉及到数据访问和性能时(我们不想在不必要时阻止)。例如,如果我们将这两个方法标记为同步的,我们将不必要地阻止两个并发的get()调用,这些调用可以很好地在没有块的情况下工作。

因此,只有当add()在进程中时,我们才想阻止get(),只有当至少有一个get()或add()在进程中时,我们才希望阻塞add ()。多个并发的get()执行不应该互相阻止.

我们该怎么做?

更新

事实上,这不是缓存,而是我提出的描述问题的用例,实际目的是创建一个单实例存储.

例如,有一种货币类型只能通过它的生成器实例化,并且是不可变的,构建器本身在验证传入的参数是有效的,这就是静态上下文中所谓的全局缓存,以确定是否已经创建了一个实例.你让我..。

这不是一个枚举用法,因为系统将动态添加新的货币、市场甚至Exchange实例,所有这些实例都应该是松散耦合的,并且只需实例化一次。(亦为防止严重的GC)

为了澄清这个问题..。想想并发的全球问题,而不是具体的例子。

我发现这个链接很有帮助,http://tutorials.jenkov.com/java-concurrency/read-write-locks.html

为此,我猜JDK中已经有一些锁类型,但还不确定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-01 15:50:12

事实上,我今天刚刚在伯塞尔斯召开的FOSDEM会议上就这个问题做了一个报告。请看这里的幻灯片:http://www.slideshare.net/cruftex/cache2k-java-caching-turbo-charged-fosdem-2015

基本上您可以使用Google,但是,因为Guava是一个使用LRU的缓存,所以仍然需要一个同步块。我正在cache2k中探索的东西是使用了一种高级的驱逐算法,它不需要对缓存访问进行列表操作,所以可以完全锁定。

cache2k位于maven中心,将cache2k-api和cache2k-core添加为依赖项,并使用以下方法初始化缓存:

代码语言:javascript
复制
cache = 
  CacheBuilder.newCache(String.class, Object.class)
    .implementation(ClockProPlusCache.class)
    .build();

如果只有缓存命中,那么cache2k比EHCache快5倍,比EHCache快10倍。对于您的使用模式,例如,对于货币类型,您可以在read中运行缓存,通过配置,并添加一个负责构造货币实例的缓存源。

因此,您不一定要注意缓存。对于货币示例,您不需要缓存,因为货币实例的空间有限。如果您想对可能的无限制空间进行同样的操作,则缓存是更通用的解决方案,因为您必须限制资源消耗。我研究过的一个示例是将此用于格式化日期。请参阅:https://github.com/headissue/cache2k-benchmark/blob/master/zoo/src/test/java/org/cache2k/benchmark/DateFormattingBenchmark.java

对于cache2k上的一般问题,可以随意在堆栈溢出上发布。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28242977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档