并发收集到50/50读/写

art*_*spb 7 java collections concurrency multithreading

我需要你的建议.首先,我想描述一些前提条件.

  1. 我有一些第三方使用默认的Java对象java.lang.ObjecthashCode()equals()执行.Comparable接口未实现.尺寸微不足道.
  2. 我需要在内存中存储这些对象一段时间.我将以50/50的比例从不同的线程读取和写入它们(大约50%的读取和50%的写入).
  3. 对象的顺序并不重要.我只想有可能从商店拿一些物品,就是这样.随着我的意思是既获得删除在同一时间.
  4. 当然,我希望它能以最低的内存消耗尽可能快地工作.我试图避免代码中的任何同步.

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

我已经实施了我的解决方案ConcurrentSkipListSet作为基础.除了一个小细节外,我的一切都很好.正如我上面提到的,我正在使用的对象没有实现Comparable.因此,要使用选定的集合,我必须以某种方式实现Comparator.这是我对这个界面的实现.在这个例子中,我直接使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这种实现的缺点是显而易见的.我发现不能保证两个不同的对象会有不同的哈希码.在这种情况下,可能会丢失一些不可接受的物体.我想在不同对象的哈希码相同的情况下返回一些随机数,但我不确定它是否会破坏ConcurrentSkipListSet实现.

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

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

提前感谢您的回答.

Thi*_*ler 3

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

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