实现一个线程安全的 LRU 缓存,不使用 LinkedHashMap。

要实现一个线程安全的 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

请使用浏览器的分享功能分享到微信等