实现一个线程安全的LRU(Least Recently Used)缓存,要求支持以下操作: 1. `Get(int key)`:如果键存在,返回对应的值,并将该键值对移至缓存头部(最近使用);否则返回 -1。 2. `Put(int key, int value)`:插入或更新键值对,若缓存已满(容量为正整数 capacity),则删除最久未使用的项后再插入新项。 要求所有操作的平均时间复杂度为 O(1),并保证在多线程环境下正确运行。 请使用 C# 实现 `LRUCache` 类,并说明关键设计思路及如何保证线程安全。