要实现一个线程安全的 LRU 缓存,而不使用
LinkedHashMap,我们可以结合 Python 的
threading 模块和
collections.OrderedDict 来实现。
OrderedDict 可以用来维护缓存的访问顺序,而
threading.Lock 可以用来确保线程安全。
下面是一个线程安全的 LRU 缓存实现:
pythonCopy Codeimport threadingfrom collections import OrderedDictclass ThreadSafeLRUCache: def __init__(self, capacity: int):
self.cache = OrderedDict()
self.capacity = capacity
self.lock = threading.Lock() def get(self, key: int) -> int: with self.lock: if key not in self.cache: return -1
else: # Move the accessed item to the end to show that it was recently used
self.cache.move_to_end(key) return self.cache[key] def put(self, key: int, value: int) -> None: with self.lock: if key in self.cache: # Update the existing key and move it to the end
self.cache.move_to_end(key)
self.cache[key] = value if len(self.cache) > self.capacity: # Pop the first item (least recently used)
self.cache.popitem(last=False)# 使用示例def worker(cache, key, value=None): if value is not None:
cache.put(key, value) print(f"Put: key={key}, value={value}") else:
result = cache.get(key) print(f"Get: key={key}, result={result}")if __name__ == "__main__":
cache = ThreadSafeLRUCache(2) # 创建多个线程来测试线程安全性
threads = [] for i in range(5): if i % 2 == 0:
t = threading.Thread(target=worker, args=(cache, i, i*10)) else:
t = threading.Thread(target=worker, args=(cache, i))
threads.append(t)
t.start() for t in threads:
t.join()
代码说明:
-
OrderedDict:用于存储缓存的键值对,并保持它们的访问顺序。 -
threading.Lock:用于确保对缓存的访问是线程安全的。通过在get和put方法中使用with self.lock语句,确保每次只有一个线程可以访问或修改缓存。 -
get方法:检查键是否存在于缓存中。如果存在,将该键移动到OrderedDict的末尾以标记为最近使用,并返回其值。如果不存在,返回-1。 -
put方法:如果键已存在,更新其值并将其移动到末尾。如果键不存在,直接添加。如果添加后缓存大小超过容量,则移除最早插入的键值对(即OrderedDict的第一个元素)。 - 线程测试:通过创建多个线程来同时访问和修改缓存,验证线程安全性。
这种实现方式通过锁机制确保了多线程环境下的安全性,同时使用
OrderedDict 高效地管理 LRU 缓存的顺序。
http://www.zgjzs.org
http://www.shangpin.org
http://www.snjrw.org
http://wangluo.zgjzs.org
http://zhineng.zgjzs.org
http://gaosu.zgjzs.org
http://anquan.zgjzs.org
http://wangzhan.zgjzs.org
http://jiaoyu.zgjzs.org
http://guanggao.zgjzs.org
http://shuju.zgjzs.org
http://zhifu.zgjzs.org
http://yingyong.zgjzs.org
http://yonghu.zgjzs.org
http://houtai.zgjzs.org
http://fenxi.zgjzs.org
http://jiekou.zgjzs.org
http://fenxiang.zgjzs.org
http://neirong.zgjzs.org
http://zhuce.zgjzs.org
http://tongji.zgjzs.org
http://ditu.zgjzs.org
http://tuisong.zgjzs.org
http://gouwu.zgjzs.org
http://tuiguang.zgjzs.org
http://shejiao.zgjzs.org
http://zhongguo.zgjzs.org
http://wangguan.zgjzs.org
http://yule.zgjzs.org
http://pingtai.zgjzs.org
http://jichu.zgjzs.org
http://wangjie.zgjzs.org
http://zhishi.zgjzs.org
http://shangcheng.zgjzs.org
http://dianzi.zgjzs.org
http://yinyue.zgjzs.org
http://tupian.zgjzs.org
http://shipin.zgjzs.org
http://wuliu.zgjzs.org
http://gongju.zgjzs.org
http://anquan.zgjzs.org
http://sousuo.zgjzs.org
http://mima.zgjzs.org
http://jiankong.zgjzs.org
http://ceshi.zgjzs.org
http://wangyou.zgjzs.org
http://zixun.zgjzs.org
http://chajian.zgjzs.org
http://kuaidi.zgjzs.org
http://liuliang.zgjzs.org
http://zhengce.zgjzs.org
http://peizhi.zgjzs.org
http://baocun.zgjzs.org
http://yonghu.shangpin.org
http://houtai.shangpin.org
http://pingtai.shangpin.org
http://wangzhan.shangpin.org
http://zhifu.shangpin.org
http://guanggao.shangpin.org
http://yinyue.shangpin.org
http://zixun.shangpin.org
http://shejiao.shangpin.org
http://tuisong.shangpin.org
http://wangguan.shangpin.org
http://zhineng.shangpin.org
http://wangluo.shangpin.org
http://anquan.shangpin.org
http://zhongguo.shangpin.org
http://shuju.shangpin.org
http://jiekou.shangpin.org
http://zhishi.shangpin.org
http://gongneng.shangpin.org
http://tongji.shangpin.org
http://shipin.shangpin.org
http://jiaoyu.shangpin.org
http://ditu.shangpin.org
http://dianzi.shangpin.org
http://mima.shangpin.org
http://liuliang.shangpin.org
http://gouwu.shangpin.org
http://zhengce.shangpin.org
http://yule.shangpin.org
http://baocun.shangpin.org
http://jichu.shangpin.org
http://fenxi.shangpin.org
http://fenxiang.shangpin.org
http://shangcheng.shangpin.org
http://kuaidi.shangpin.org
http://peizhi.shangpin.org
http://wuliu.shangpin.org
http://ceshi.shangpin.org
http://tupian.shangpin.org
http://wangyou.shangpin.org
http://chajian.shangpin.org
http://tuiguang.shangpin.org
http://yingyong.shangpin.org
http://zhuce.shangpin.org
http://sousuo.shangpin.org
http://jiankong.shangpin.org
http://neirong.shangpin.org
http://gongju.shangpin.org
http://zonghe.shangpin.org
http://zhifu.snjrw.org
http://houtai.snjrw.org
http://yule.snjrw.org
http://wangluo.snjrw.org
http://guanggao.snjrw.org
http://shuju.snjrw.org
http://pingtai.snjrw.org
http://ditu.snjrw.org
http://wangzhan.snjrw.org
http://shejiao.snjrw.org
http://jiekou.snjrw.org
http://zhishi.snjrw.org
http://zhineng.snjrw.org
http://jiaoyu.snjrw.org
http://zhongguo.snjrw.org
http://yinyue.snjrw.org
http://yonghu.snjrw.org
http://tuiguang.snjrw.org
http://gouwu.snjrw.org
http://baocun.snjrw.org
http://fenxiang.snjrw.org
http://fenxi.snjrw.org
http://gongneng.snjrw.org
http://wangguan.snjrw.org
http://zixun.snjrw.org
http://dianzi.snjrw.org
http://tupian.snjrw.org
http://wangyou.snjrw.org
http://chajian.snjrw.org
http://wuliu.snjrw.org
http://mima.snjrw.org
http://liuliang.snjrw.org
http://zhuce.snjrw.org
http://zhengce.snjrw.org
http://peizhi.snjrw.org
http://shipin.snjrw.org
http://jichu.snjrw.org
http://tongji.snjrw.org
http://kuaidi.snjrw.org
http://yingyong.snjrw.org
http://sousuo.snjrw.org
http://jiankong.snjrw.org
http://neirong.snjrw.org
http://gongju.snjrw.org
http://tuisong.snjrw.org
http://shangcheng.snjrw.org
http://anli.snjrw.org
http://dianhua.snjrw.org
http://fuwu.snjrw.org