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