gpt4 book ai didi

java - java中有线程安全且元素唯一的队列吗?

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:49 24 4
gpt4 key购买 nike

就像“ConcurrentHashMap”和“ConcurrentLinkedQueue”的混合体。

这是我的要求:
我需要一个异步更新的缓存系统。这意味着我在将每个实体设置到内存缓存之前将其包装起来。 warpper 中有一个时间戳,指示其内容何时过期。前端的每个请求都会从memcache中获取数据,如果warpper显示过期,就会产生一个update事件放入concurrentLinkedQueue中,然后异步等待更新。
问题是:我不想徒劳地多次更新一个实体。在将事件添加到队列之前,我希望找到一种方法来确保队列中已经没有相同实体的事件。

如果我以这些方式进行,可以吗?

1、创建一个warpper类,里面包含一个hashMap和一个linkedList。它的所有方法都是同步的:

public synchronized boolean add(String key,Object value){
if(hashMap.containsKey(key)){
return false;
}else{
hashMap.put(key,value);
return linkedList.offer(value);
}
}

我相信这个解决方案会非常慢。
也许就像 Collections.synchronizedMap(new LinkedHashMap()) 一样。

2,就用一个concurrentHashMap。如果我需要“轮询”操作,请从中迭代一个元素。

public Object poll(){
Collection valueColl = concurrentHashMap.values();
if(valueColl.isEmpty()){
retrun null;
}
return valueColl.get(0);
}

操作 concurrentHashMap.values().get(0) 是否慢?

3、查看“ConcurrentHashMap”和“ConcurrentLinkedQueue”的源码,有条件的话写一个“ConcurrentUniqueLinkedQueue”。
目前这对我来说有点难。

那么,你们怎么看呢?

最佳答案

我不认为您想丢弃最新的更新。也许您正在使它变得比需要的更复杂。

public void add(K key, V value) {
concurrentMap.put(key, value);
queue.add(key);
}

public V poll() {
for(K key; (key = queue.take()) != null;) {
V value = concurrentMap.remove(key);
if (value != null)
return value;
// value will be null if it's a duplicate so ignore and look for more.
}
return null;
}

这将为您提供排队顺序中键的最新值。它不需要任何锁定。

关于java - java中有线程安全且元素唯一的队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14642678/

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