我正在尝试支持对一个定期清除的哈希表进行并发操作。我有一个缓存,存储一段时间内的数据。每隔5分钟,缓存中的数据会被发送到服务器。一旦我刷新了缓存,就想清空它。问题是,当我在执行这个操作时,可能会有数据被写入到这个映射表中,使用了已存在的键。如何使这个过程线程安全?
data class A(val a: AtomicLong, val b: AtomicLong) {
fun changeA() {
a.incrementAndGet()
}
}
class Flusher {
private val cache: Map<String, A> = ConcurrentHashMap()
private val lock = Any()
fun retrieveA(key: String){
synchronized(lock) {
return cache.getOrPut(key) { A(key, 1) }
}
}
fun flush() {
synchronized(lock) {
// send data to network request
cache.clear()
}
}
}
// Existence of multiple classes like CacheChanger
class CacheChanger{
fun incrementData(){
flusher.retrieveA("x").changeA()
}
}
我担心上述缓存没有得到正确同步。有更好/正确的方式来锁定这个缓存,以便我不会丢失数据吗?我应该创建一个缓存的深拷贝并清空它吗?
由于上述数据可能会被另一个修改者更改,这难道不会导致问题吗?
cache
的类型设置为ConcurrentMap
才能获得适当的并发行为。 - Louis Wasserman