小编art*_*spb的帖子

并发收集到50/50读/写

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

  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. 是否有其他方法来存储我的对象?

提前感谢您的回答.

java collections concurrency multithreading

7
推荐指数
1
解决办法
202
查看次数

什么更快:instanceof或isInstance?

除了设计问题,在现代JVM上执行速度更快的是什么?

foo instanceof Bar
Run Code Online (Sandbox Code Playgroud)

要么

Bar.class.isInstance(foo)
Run Code Online (Sandbox Code Playgroud)

为什么?

java jvm instanceof

0
推荐指数
1
解决办法
757
查看次数