如何锁定免费使用java / scala中的两个ConcurrentHashMap?

我很久以前就对这个问题感到头痛,希望能有一些帮助。
我想存储许多TaskConcurrentSkipListMap该内是ConcurrentHashMap已知为多段锁。
简单的示例代码用scala显示(java也可读):
val tasks = new ConcurrentSkipListMap[TaskKey, Task]()将类简单引用为:

class TaskKey(id: String, systemTime: Long)
用于识别任务的TaskKey类是唯一的,任务如下:

trait Task {
  val taskId: TaskKey //account and custom name
  def execute(): Unit //do the task
}

当我使用TaskKey来操作时,我的HashMap实际上是Grate,但实际上,HashMap可以很少访问。因此,我必须定义另一个ConcurrentHashMap来将ID的映射存储到TaskKey中:
val auxiliaryMap = new ConcurrentHashMap[String, 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
  }
}

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

另外,TaskKey包含一个用于排序数据的systemTime变量,完成ConcurrentSkipListMap定义如下:

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
  }
})

如果我错过了一些事情,欢迎任何问题。


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

链接地址: http://www.djcxy.com/p/91921.html

上一篇: how to lock free use two ConcurrentHashMap in java/scala?

下一篇: Safely iterate an ConcurrentHashMap that is accessed by multiple thread