如何锁定自由使用java / scala中的两个ConcurrentHashMap?

时间:2016-07-29 06:13:36

标签: java multithreading scala concurrenthashmap

很久以前我对这个问题很头疼,希望能有所帮助 我想要存储多个Task ConcurrentSkipListMapConcurrentHashMap内部为val tasks = new ConcurrentSkipListMap[TaskKey, Task](),称为多段锁定。
简单的示例代码用scala(java也可读)显示:
class TaskKey(id: String, systemTime: Long) 将类简单称为:

trait Task { val taskId: TaskKey //account and custom name def execute(): Unit //do the task }
用于标识Task的TaskKey类是唯一的,Task如下:

val auxiliaryMap = new ConcurrentHashMap[String, TaskKey]()

当我使用TaskKey操作我的HashMap时,实际上,HashMap只能用id访问。所以,我必须定义另一个ConcurrentHashMap来存储id到TaskKey的地图:
def get(taskId: String) = { Option(auxiliaryMap.get(taskId)).flatMap{x => //try get TaskKey //if TaskKey exist, try get it. Option(tasks.get(x)) //make null to None } } def remove(taskId: String) = { Option(auxiliaryMap.remove(taskId)).flatMap{ x => //try get TaskKey //if TaskKey exist, try remove it. Option(tasks.remove(x)) //make null to None } }
让我们考虑添加和删除操作:

ConcurrentSkipListMap

显然,尽管Map都是线程安全的,但是包装器使数据不一致。 如果我使用锁定,则多段映射变得毫无意义。如何处理问题使两个ConcurrentHashMap运行良好?

此外,TaskKey包含一个用于对数据进行排序的systemTime变量,完成val tasks = new ConcurrentSkipListMap[TaskKey, Task](new Comparator[TaskKey]() { override def compare(o1: TaskKey, o2: TaskKey): Int = { val compare = (o1.systemTime - o2.systemTime).toInt if (compare == 0) { o1.hashCode() - o2.hashCode() } else compare //distinct same time task } }) 定义如下:

    .sample
{
  position: absolute; top: 0px; left: 0px;pointer-events:none;
}

<div style="overflow-x: scroll; overflow-y: hidden; width: 300px; height: 130px; white-space: nowrap; ">
            s sd ds fsd fs df s fs fds fsd fsd fsd fds f sdf sd fs fsd f sdf sd f sdf sd f sdf ds fsdf sf ds f sdf dsf sdf s df sdf sdf ds fsd fsdf sd fds 
            <br/>fsd fds f sd fsd fsd fds fs df sd f sd fds f sd f sdf sd f ds fsdf s df sd fs df sdfsd f 
            <br/>sdf ds f sdf sd f dsf sd fds f ds fs df sd fds f ds f sd fs df sd fsdfs df sdf sd fs df sd fsd 
            <br/>sdf ds f sdf sd f dsf sd fds f ds fs df sd fds f ds f sd fs df sd fsdfs df sdf sd fs df sd fsd 
            <br/>sdf ds f sdf sd f dsf sd fds f ds fs df sd fds f ds f sd fs df sd fsdfs df sdf sd fs df sd fsd 
</div>
<div class='sample'>
            <img src="http://www.wabmo.com/Album/watermark/watermarks/Sample-trans.png" width="300"/>
</div>

如果我错过任何问题,欢迎提出任何问题。

1 个答案:

答案 0 :(得分:0)

我正在使用消息队列将运算符压平到这些map.besides,这种方式根本不需要concurrenthashmap,但消息队列可能需要并发队列。