c#题例-2025-08-01 21:31:49
日期: 2025-08-01 分类: AI写作 16次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它融合了 **委托、泛型、闭包、线程安全、延迟执行、设计模式(策略模式)** 等多个高级概念,考察候选人对 C# 特性和底层机制的理解:
---
### 🧠 面试题:实现一个线程安全的延迟缓存(Lazy Thread-Safe Cache)
#### 📌 题目描述:
你需要实现一个通用的缓存类 `LazyCache
1. 缓存中存储的每个值是通过一个委托 `Func
2. 如果多个线程同时请求一个尚未缓存的键,只允许一个线程执行委托,其余线程应等待其结果。
3. 一旦某个键的值被计算完成,后续对该键的访问应直接返回缓存结果(不重新计算)。
4. 保证线程安全,避免重复计算,同时避免死锁。
---
### 🔧 接口定义:
```csharp
public class LazyCache
{
public LazyCache();
public T GetOrAdd(string key, Func
}
```
---
### 🧪 示例:
```csharp
var cache = new LazyCache
Parallel.For(0, 100, i =>
{
var result = cache.GetOrAdd("answer", () =>
{
Console.WriteLine("Computing...");
Thread.Sleep(100); // 模拟耗时操作
return 42;
});
Console.WriteLine(result);
});
```
在上面的代码中,“Computing...” 应该只输出一次。
---
### ✅ 考察点:
- 对 `ConcurrentDictionary` 的高级使用(尤其是 `GetOrAdd` 的嵌套使用)
- 对 `Lazy
- 正确使用 `lock` 或 `SemaphoreSlim` 控制并发访问
- 对闭包和委托执行上下文的理解
- 避免死锁和资源竞争的能力
- 设计优雅、可维护、线程安全的数据结构
---
### 💡 提示:
- 可以考虑使用 `ConcurrentDictionary
- 或者使用 `ConcurrentDictionary
- 注意 Lazy 的线程模式(`LazyThreadSafetyMode.ExecutionAndPublication`)
---
### 🧩 可扩展问题(进阶):
1. 如何为缓存添加过期时间?
2. 如何支持异步工厂方法(`Func
3. 如何在不使用锁的前提下实现线程安全?
4. 如何测试并发安全性?
---
如果你需要这道题的标准答案或实现思路,我也可以提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐