没有 Collections.synchronized 的线程安全 LinkedHashMap

Vik*_*Vik 7 java concurrency multithreading data-structures oracle-maf

我正在使用 LinkedHashMap 并且环境是多线程的,因此该结构需要是线程安全的。在特定事件期间,我需要读取整个地图推送到数据库并清除所有内容。

大多数时候只有写入发生在这张地图上。该地图的条目限制为 50 个。

我正在使用 Oracle MAF,但它没有可用的 Collections.syncronizedMap。那么,我需要在同步块中放入哪些内容,以确保写入和读取不会出现并发修改异常等

几个要求:

  1. 我需要将其表现得像一个循环队列,因此重写 LinkedHashMap 的 removeEldestEntry 方法。
  2. 我需要保留订单

Pet*_*rey 5

那么,我需要在同步块中放入哪些内容,以确保写入和读取不会出现并发修改异常等

所有方法调用都应该在同步块中。

棘手的是迭代器的使用,因为您必须在迭代器的生命周期内保持锁定。例如

// pre Java 5.0 code
synchronized(map) { // the lock has to be held for the whole loop.
    for(Iterator iter = map.entrySet().iterator(); iter.hashNext(); ) {
         Map.Entry entry = iter.next();
         String key = (String) entry.getKey();
         MyType value = (MyType) entry.getValue();
         // do something with key and value.
    }
}
Run Code Online (Sandbox Code Playgroud)