art*_*spb 7 java collections concurrency multithreading
我需要你的建议.首先,我想描述一些前提条件.
java.lang.Object的hashCode()和equals()执行.Comparable接口未实现.尺寸微不足道.首先,我试图自己解决这个问题.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实现.
关于描述的情况,我有两个一般性问题.
Comparator这种方式为我的对象实现不返回0不同的对象并保持ConcurrentSkipListSet可操作性?提前感谢您的回答.
也许您正在寻找ConcurrentLinkedQueue,这将根据 FiFo(先进先出)顺序存储项目。因此,不存在hashcode任何要求。comparable这个队列的实现非常高效,没有任何内部锁定。
您遇到的一个困难(当不使用锁时)是您无法检查集合是否不为空,然后获取一个(因为在您检查之后和执行操作之前它可能已更改)。因此,当什么都不存在时,该take函数将返回。null如果您不想继续轮询数据,那么您还可以求助于实现该BlockingQueue接口的类,这提供了等待数据可用的功能。