Java ConcurrentHashMaps和锁

Java ConcurrentHashMaps和锁,java,Java,我有一节这样的课 public class Cache { private static final ConcurrentHashMap<String, Cache> CACHE = new ConcurrentHashMap<String, Cache>(); ConcurrentHashMap<Long,ClassA> mapA = new ConcurrentHashMap<String,Cla

我有一节这样的课

public class Cache
{
    private static final ConcurrentHashMap<String, Cache> 
        CACHE = new ConcurrentHashMap<String, Cache>();

    ConcurrentHashMap<Long,ClassA> mapA = 
        new ConcurrentHashMap<String,ClassA>();

    ConcurrentHashMap<Long,Date> mapB = 
         new ConcurrentHashMap<Long,Date>();

}
公共类缓存
{
私有静态最终ConcurrentHashMap
CACHE=新的ConcurrentHashMap();
ConcurrentHashMap映射a=
新的ConcurrentHashMap();
ConcurrentHashMap映射b=
新的ConcurrentHashMap();
}
该类中还有其他几个方法可以添加、删除两个映射中的键。 当一个线程更新映射时,另一个线程可以更新同一缓存实例的映射。 我还需要定期将此缓存保存到磁盘。我需要读写锁来维护吗
保存时数据的完整性

据我所知,ConcurrentHashMaps在内部是线程安全的,因此不需要任何对象锁

一种支持完全并发的检索和调整的哈希表 更新的预期并发性。这个类遵循相同的函数 规范为哈希表,并包括方法的版本 对应于哈希表的每个方法。然而,即使所有 操作是线程安全的,检索操作不需要 锁定,并且不支持在中锁定整个表 阻止所有访问的方法


据我所知,ConcurrentHashMaps在内部是线程安全的,因此不需要任何对象锁

一种支持完全并发的检索和调整的哈希表 更新的预期并发性。这个类遵循相同的函数 规范为哈希表,并包括方法的版本 对应于哈希表的每个方法。然而,即使所有 操作是线程安全的,检索操作不需要 锁定,并且不支持在中锁定整个表 阻止所有访问的方法


这取决于应用程序逻辑。例如,当其他线程更改映射时,您可以安全地迭代映射的条目并将它们保存到文件中。但这将不是一个原子操作。如果想要一致的快照,则需要同步

这取决于应用程序逻辑。例如,当其他线程更改映射时,您可以安全地迭代映射的条目并将它们保存到文件中。但这将不是一个原子操作。如果想要一致的快照,则需要同步

ConcurrentHashMap的writeObject在序列化之前锁定每个段,因此您不必担心数据的完整性。注意:段之间可能存在间隙(对象序列化时,未锁定段上的更新)。如果希望在writeObject期间完全锁定,请使用Collections.synchronizedMap()

请参阅方法ConcurrentHashMap.writeObject():

private void writeObject(java.io.ObjectOutputStream s)引发IOException{
//强制所有段实现序列化兼容性
对于(int k=0;k
ConcurrentHashMap的writeObject在序列化之前会锁定每个段,因此您无需担心数据的完整性。注意:段之间可能存在间隙(对象序列化时,未锁定段上的更新)。如果希望在writeObject期间完全锁定,请使用Collections.synchronizedMap()

请参阅方法ConcurrentHashMap.writeObject():

private void writeObject(java.io.ObjectOutputStream s)引发IOException{
//强制所有段实现序列化兼容性
对于(int k=0;k
但这仅针对单个CHM[方法调用],不在多个CHM对象之间添加原子性。但这仅针对单个CHM[方法调用],不在多个CHM对象之间添加原子性。如果操作需要操作之间的原子性-例如,同一CHM上的多个操作或多个CHM之间的分散(或其他对象)-然后您需要考虑这些。如果操作需要操作之间的原子性-例如,在同一CHM上的多个操作或多个CHM(或其他对象)之间的分散-那么您需要考虑这些。
private void writeObject(java.io.ObjectOutputStream s) throws IOException {
        // force all segments for serialization compatibility
        for (int k = 0; k < segments.length; ++k)
            ensureSegment(k);
        s.defaultWriteObject();

        final Segment<K,V>[] segments = this.segments;
        for (int k = 0; k < segments.length; ++k) {
            Segment<K,V> seg = segmentAt(segments, k);
            seg.lock();
            try {
                HashEntry<K,V>[] tab = seg.table;
                for (int i = 0; i < tab.length; ++i) {
                    HashEntry<K,V> e;
                    for (e = entryAt(tab, i); e != null; e = e.next) {
                        s.writeObject(e.key);
                        s.writeObject(e.value);
                    }
                }
            } finally {
                seg.unlock();
            }
        }
        s.writeObject(null);
        s.writeObject(null);
    }