gpt4 book ai didi

java - 同步缓存服务实现

转载 作者:行者123 更新时间:2023-12-02 04:24:40 24 4
gpt4 key购买 nike

我正在开发一个java应用程序,需要实现缓存服务来服务请求。要求是这样的:

1) 1 个或多个线程来获取一些数据,如果数据为 null 那么只有一个线程去DB加载缓存中的数据。

2)完成后,所有后续线程都将从缓存中提供服务。

因此,实现如下:

public List<Tag> getCachedTags() throws Exception 
{
// get data from cache
List<Tag> tags = (List<Tag>) CacheUtil.get(Config.tagCache,Config.tagCacheKey);
if(tags == null) // if data is null
{
// one thread will go to DB and others wait here
synchronized(Config.tagCacheLock)
{
// first thread get this null and go to db, subsequent threads returns from here.
tags = (List<Tag>) CacheUtil.get(Config.tagCache,Config.tagCacheKey);
if(tags == null)
{
tags = iTagService.getTags(null);
CacheUtil.put(Config.tagCache, Config.tagCacheKey, tags);
}
}
}
return tags;
}

现在这是正确的方法,并且当我在静态字符串中锁定时,那么它不是一个类级别的锁吗?请建议我一些更好的方法

最佳答案

如果你想全局同步,只需使用自定义对象即可:

private static final Object lock = new Object();

请勿使用String因为它们是常量,所以在程序的完全不同部分声明的具有相同内容的字符串常量将是相同的 String目的。一般来说,避免锁定静态字段。最好实例化您的类并将锁声明为非静态的。目前,您可以将其用作单例(使用像 Cache.getInstance() 这样的方法),但是稍后当您意识到必须支持多个独立的缓存时,您将需要更少的重构来实现这一点。

在 Java-8 中,获取一次对象的首选方法是使用 ConcurrentHashMap.computeIfAbsent像这样:

private final ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>();

public List<Tag> getCachedTags() throws Exception
List<Tag> tags = (List<Tag>)cache.computeIfAbsent(Config.tagCacheKey,
k -> iTagService.getTags(null));

return tags;
}

这简单而强大。在以前的 Java 版本中,您可能会使用 AtomicReference包裹对象:

private final ConcurrentHashMap<String, AtomicReference<Object>> cache = 
new ConcurrentHashMap<>();

public List<Tag> getCachedTags() throws Exception
AtomicReference<Object> ref = cache.get(key);
if(ref == null) {
ref = new AtomicReference<>();
AtomicReference<Object> oldRef = cache.putIfAbsent(key, ref);
if(oldRef != null) {
ref = oldRef;
}
synchronized(ref) {
if(ref.get() == null) {
ref.set(iTagService.getTags(null));
}
}
}
return (List<Tag>)ref.get();
}

关于java - 同步缓存服务实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32345999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com