【问题标题】:How to Implement Map with Queue of objects如何使用对象队列实现地图
【发布时间】:2016-09-21 03:50:20
【问题描述】:

我有点困惑如何实现以下输出,

{ 
     "finalOutput":{["test":{[],[],[],[],[],[],[],[],[],[]},
     "test1":{[],[],[]....[]},
     "test2":{[],[]....[]}]}
}

.

对于这个输出,One Key 应该有 10 个具有队列概念的对象。 例如键为college : {[],[],[],[],[],[],[]..}。每个键不应超过 10 个值。所以我想用ConcurrentLinkedDeque<Object> 来实现。我不知道如何实施。

我正在考虑MultivaluedMap,但我需要检查每个键有 10 个或更少的对象。不应该超过 10,所以需要检查 FIFO 策略。(如果超过 10 需要先删除并插入值。)

任何人都可以建议我如何实施。如果有人有样品请帮助我。

【问题讨论】:

  • 是json对象吗?
  • 是的,Json 对象,但也需要用 FIFO 实现,所以我很困惑如何实现。
  • 由 JSON RFC:“对象是无序的”。如果每个 '[]' (数组)都是您的 FIFO 队列中的元素,那么它就行不通了。 rfc-editor.org/rfc/rfc7159.txt

标签: java hashmap queue java.util.concurrent


【解决方案1】:

您可以设计一个值为 BlockingQueue 的地图,其大小为 10 。如果某些地方可能导致并发内不安全,请告诉我。我觉得还可以。

Map<String,BlockingQueue<Object>> map = new ConcurrentHashMap<String,BlockingQueue<Object>>(){
        @Override
        public BlockingQueue<Object> put(String key,
                BlockingQueue<Object> value) {
        BlockingQueue<Object> current = this.get(key);
        synchronized (current) {
            if(current.size() == 10){
            current.remove();
            }
            current.add(value.peek());
        }
            return super.put(key, current);
        }

        @Override
        public BlockingQueue<Object> get(Object key) {
        if(this.contains(key))
            return super.get(key);
        else
            return new LinkedBlockingQueue<Object>(10);
        }
    };

    }

【讨论】:

  • 太好了,非常感谢您的建议,但我想 ConcurrentLinkedDeque 不是 BlockingQueue 更好吗? Bz ConcurrentLinkedDeque 支持多线程和线程安全。
  • 1.为什么要覆盖 put/get? 2.如果性能很重要,这个实现将是多线程环境中的争论点。避免同步,并使用该语言为您提供的更好的并发原语。在这件事上,只需使用 ConcurrentMap 的 'compute' 方法 - 锁管理更正确,您将避免这种奇怪的代码。
  • @MichaelArenzon 覆盖 put/get 以满足要求。永远不应该使用synchronized 吗?你有没有明白什么 Dharmaraja.k 什么?
  • @passion 我做过。这是扩展具体实现的极其糟糕的做法,更糟糕的是覆盖具体的数据结构。这个覆盖只是破坏了 ConcurrentHashMap 的整个想法。正如我之前所说,这整段代码可以简单地替换为“ConcurrentMap”为您提供的原子操作,并且只需使用“compute”方法即可。
  • @MichaelArenzon concurrentmap 有一个名为 compute 的方法?
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2014-01-19
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多