gpt4 book ai didi

java - 并发收集到 50/50 读/写

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:34 25 4
gpt4 key购买 nike

我需要你的建议。首先,我想描述先决条件。

  1. 我有一些第三方 Java 对象,它们具有默认 java.lang.ObjecthashCode()equals() 实现。 Comparable 接口(interface)未实现。大小是微不足道的。
  2. 我需要在内存中存储这些对象一段时间。我将以 50/50 的比例从不同线程读取和写入它们(大约 50% 读取和 50% 写入)。
  3. 对象的顺序并不重要。我只是想有可能从商店拿一些东西,仅此而已。 take 是指同时getremove
  4. 当然,我希望它以最低的内存消耗尽可能快地运行。我试图避免在我的代码中进行任何同步。

首先我试图自己解决这个问题。由于高内存消耗,我立即拒绝了 CopyOnWriteArray* 集合。我读过最好在很少写入的情况下使用它们。 ConcurrentHashMap 在一般套件中满足我的需要,但我没有找到方法使 take 操作在没有同步的情况下成为原子操作。我已经停止对 ConcurrentSkipListSet 集合的调查。它包含 pollFirst 方法,该方法非常适合获取 对象。

我已经以 ConcurrentSkipListSet 为基础实现了我的解决方案。除了一个小细节外,我一切正常。正如我在上面提到的,我正在使用的对象没有实现 Comparable。所以要使用选择的集合,我必须以某种方式实现 Comparator。这是我对该接口(interface)的实现。在此示例中,我直接使用了 java.lang.Object 而不是我的对象类型。我这样做是因为实现完全相同,区别仅在于类的通用部分。

import java.util.Comparator;

public class ObjectComparator implements Comparator<Object> {

public int compare(Object o1, Object o2) {
return o1.hashCode() - o2.hashCode();
}
}

这个实现的缺点是显而易见的。我发现有 no guarantee两个不同的对象将具有不同的哈希码。在这种情况下,可能会丢失一些 Not Acceptable 元素。我想在不同对象的哈希码相同的情况下返回一些随机数,但我不确定它不会破坏 ConcurrentSkipListSet 实现。

关于所描述的情况,我有两个一般性问题。

  1. 是否有可能为我的对象实现Comparator,这样就不会为不同的对象返回0,并保持ConcurrentSkipListSet的可操作性?
  2. 是否有其他方式来存储我的对象?

预先感谢您的回答。

最佳答案

可能您正在寻找 ConcurrentLinkedQueue ,这将根据 FiFo(先进先出)顺序存储项目。因此,不存在 hashcodecomparable 要求。这个队列的实现非常高效,没有任何内部锁定。

您遇到的一个困难(当不使用锁时)是您无法检查集合是否不为空然后取一个(因为它可能在您检查之后和您的操作之前发生变化)。因此,当什么都不存在时,take 函数将返回 null。如果你不想继续轮询数据,那么你也可以求助于实现 BlockingQueue 的类。接口(interface),这提供了等待数据可用的功能。

关于java - 并发收集到 50/50 读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122988/

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