前些时候用到了apache的Lrumap,用来维护N个用户的定购关系列表,大致是Lrumap<string,List<string>>后来测试的时候出现了一个很奇怪的问题,就是系统运行一段时间后会发现某些用户的某些定购关系在内存中不存在,但是数据库中却是有值的。开始的时候我怀疑用户名id(即map的key)所对应的List空掉了,最后想了很久发现应该是值缺失了一部分,而不是空掉了。
下边是一个经过抽象后的简单模型:
Map<String, List<String>> m = new LruMap<String, List<String>>;
// 由于最新的apache 的common-collection3.2.1包中的lrumap是不同步的.
// 所以我想当然的对其进行了一次同步。
boolean foo(value) {
List<String> list;
synchronized (m) {
list = m.get(uid);
}
if (list == null) {
list = getdataFormDatabase(); // 将其放在外边是由于这块可能非常慢,而并发又很严重,考虑到性能就放同步块外边了
synchronized (m) {
m.put(uid, list);
}
return list.contains(value);
} else {
return list.contains(value); // 问题出现在这里,返回的是false,实际上应该为true
}
}
foo(uid, value) {
List<String> list;
synchronized (m) {
list = m.get(uid);
}
if (list == null) {
list = getDataFromDatabase(); // 理由同上
list.add(value);
synchronized (m) {
m.put(uid,list);
}
} else {
list.add(value);
}
}
分享到:
相关推荐
线程安全是指缓存能够在多线程环境中安全地执行读写操作,而不影响缓存的正确性和性能。为了实现线程安全,LRU 缓存采用了多种机制,例如使用锁机制来保护缓存的访问,使用 atomic reference 来维护缓存的顺序。 4....
以上代码展示了LRU算法的基本思路,但并未涵盖所有细节,例如错误处理和多线程安全。在实际应用中,还需要考虑这些因素以确保正确性和性能。这个简单的C++实现可以作为一个起点,根据具体需求进行扩展和优化。
在ConcurrentLinkedHashMap-LRU 1.3中,这种策略被巧妙地融入到并发环境下,保证了在多线程环境下的高效运行。 该版本的ConcurrentLinkedHashMap实现了ConcurrentMap接口,保证了线程安全的读写操作。其核心设计...
综上所述,这个项目展示了如何利用Volley进行网络请求和FastJson解析JSON数据,同时结合多线程和图片缓存技术优化用户体验。万能适配器则使得数据绑定更加灵活,解决了图片排序和加载问题,提升了应用的整体性能。
在实际编程中,可能还需要考虑并发安全,如果在多线程环境下使用,可以使用ConcurrentHashMap替换HashMap,使用LinkedBlockingDeque替换LinkedList,并使用synchronized关键字进行同步控制。 总的来说,Java实现LRU...
这个简单的实现提供了一种基础的LRU缓存机制,但实际应用中可能需要考虑线程安全、性能优化等更多因素。例如,可以使用`ConcurrentHashMap`代替`HashMap`以支持并发操作,或者使用`LinkedHashMap`替代自定义的链表...
7. **映射(Map)**: Go的标准库中的映射(map)并非完全线程安全,因此在多线程环境中使用时,需要额外的同步措施,如使用互斥锁或读写锁。 8. **双端队列(Doubly Linked List)**: 双端队列允许在两端进行插入和删除...
Java集合框架中的Map接口是Java编程中非常重要的一个部分,它提供了一种存储键值对数据的方式。在Map中,每个键(key)都是...同时,如果在多线程环境中,可以考虑使用`ConcurrentHashMap`,它提供了线程安全的操作。
为了在多线程环境中安全地访问Singleton实例,文章使用了读写互斥锁(Read-Write Lock)进行同步。读写互斥锁允许多个读取者同时访问资源,但只允许一个写入者。这样可以提高并发性能,因为读操作通常是无冲突的,而...
注意,这个简化版本的LRU缓存并没有处理并发情况,如果在多线程环境下使用,还需要添加适当的同步机制,例如使用互斥锁。 总之,LRU替换策略是优化系统性能的关键手段之一,通过高效的数据结构实现,可以在内存资源...
- 锁和同步:多线程环境下,需要确保数据结构的线程安全,避免数据竞争。 页面替换算法的选择和实现直接影响系统的性能。不同的工作负载和应用环境可能会使得某种算法表现更优。因此,在实际操作系统的内存管理中,...
- **并发需求**:在多线程环境中,应选择线程安全的Map实现,如Java中的`ConcurrentHashMap`,或者使用`std::unordered_map`加上适当的同步机制(例如互斥锁)来实现。 总之,Map作为一种灵活且高效的数据结构,其...
5. **线程安全**:在多线程环境中,确保对缓存的操作是线程安全的。如果是并发访问,应使用ConcurrentHashMap。 6. **缓存更新与一致性**:当源数据发生更改时,需要同步更新缓存,以保持数据一致性。 7. **缓存...
其线程安全的特性使得基于ConcurrentHashMap的LocalCache在多线程并发环境下的操作是安全的。在JDK1.8中,ConcurrentHashMap还支持完全并发读,这对本地缓存的效率也是一种提升。 基于LinkedHashMap的实现 ...
- GIL(全局解释器锁):理解Python的GIL限制了多线程的并行执行,但在多核CPU上,多进程可以实现真正的并行计算。 - `concurrent.futures`模块:提供线程池和进程池,方便地进行异步任务调度。 7. **C扩展与...
内存缓存利用Java集合框架如LRUMap(Least Recently Used Map)存储最近使用的图片,当内存不足时自动移除最不常用的图片。磁盘缓存则将图片保存在设备的文件系统中,通常在应用的私有目录下。 3. **图片处理**:...
4. **网络模型**:Memcached采用多线程非阻塞IO复用,Redis使用单线程的多路IO复用模型。 **Redis常见数据结构及其应用场景:** 1. **String**:基础的键值对,常用于存储简单数据,如计数器(如微博数、粉丝数)。...
6. **并发编程与ConcurrentHashMap**:在多线程环境下,Java提供`java.util.concurrent.ConcurrentHashMap`类,它提供了线程安全的Map实现,同时保持高性能。相比于`synchronized` Map,ConcurrentHashMap使用分段锁...
7. **多线程与多进程**: Python的全局解释器锁(GIL)限制了多线程在CPU密集型任务中的并行性,但在IO密集型任务中,多线程依然有用。多进程可以绕过GIL,利用多核CPU资源,但有额外的进程管理开销。 8. **并发与...