c#题例-2025-06-16 04:45:50
日期: 2025-06-16 分类: AI写作 13次阅读
好的!以下是一道专家级别的 C# 程序员逻辑面试题,涉及多线程、并发和性能优化等高级主题:
---
### 面试题:设计一个高效的线程安全的计数器
**问题描述:**
你需要设计一个线程安全的计数器类 `ThreadSafeCounter`,支持以下功能:
1. **Increment()**: 将计数器的值加 1。
2. **Decrement()**: 将计数器的值减 1。
3. **GetValue()**: 返回当前计数器的值。
要求:
- 该计数器必须是线程安全的,能够同时处理多个线程的并发操作。
- 在高并发环境下,尽量减少锁的开销以提高性能。
- 提供详细的代码实现,并解释为什么你的实现是高效的。
**提示:**
- 考虑使用 .NET 提供的同步机制(如 `lock`、`Interlocked` 类、`SemaphoreSlim` 等)。
- 分析不同实现方式的性能差异。
---
### 参考答案思路:
#### 方法 1:使用 `lock`
```csharp
public class ThreadSafeCounter
{
private int _count;
private readonly object _lock = new object();
public void Increment()
{
lock (_lock)
{
_count++;
}
}
public void Decrement()
{
lock (_lock)
{
_count--;
}
}
public int GetValue()
{
lock (_lock)
{
return _count;
}
}
}
```
**优点:**
- 实现简单,易于理解。
- 确保线程安全。
**缺点:**
- 使用 `lock` 会导致较高的锁开销,在高并发场景下可能成为性能瓶颈。
---
#### 方法 2:使用 `Interlocked` 类
```csharp
public class ThreadSafeCounter
{
private int _count;
public void Increment()
{
Interlocked.Increment(ref _count);
}
public void Decrement()
{
Interlocked.Decrement(ref _count);
}
public int GetValue()
{
return Interlocked.CompareExchange(ref _count, 0, 0);
}
}
```
**优点:**
- `Interlocked` 是无锁操作,性能优于 `lock`。
- 更适合高频读写的场景。
**注意:**
- `Interlocked.CompareExchange` 是一种原子操作,用于在不加锁的情况下获取变量的值。
---
#### 方法 3:结合 `ReaderWriterLockSlim`
```csharp
using System.Threading;
public class ThreadSafeCounter
{
private int _count;
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
public void Increment()
{
_lock.EnterWriteLock();
try
{
_count++;
}
finally
{
_lock.ExitWriteLock();
}
}
public void Decrement()
{
_lock.EnterWriteLock();
try
{
_count--;
}
finally
{
_lock.ExitWriteLock();
}
}
public int GetValue()
{
_lock.EnterReadLock();
try
{
return _count;
}
finally
{
_lock.ExitReadLock();
}
}
}
```
**优点:**
- 支持多线程读取时的高性能(读锁可以被多个线程共享)。
- 写操作时互斥,确保数据一致性。
**缺点:**
- 相比 `Interlocked`,实现复杂度更高。
---
### 性能对比分析:
1. **低并发场景**:`lock` 和 `ReaderWriterLockSlim` 性能接近,但 `Interlocked` 更快。
2. **高并发场景**:`Interlocked` 的性能最优,因为它是无锁操作;`ReaderWriterLockSlim` 次之,适合读多写少的场景;`lock` 性能最差,因为锁的竞争会显著增加开销。
---
希望这道题目能够挑战到候选人的多线程编程能力和性能优化思维!如果需要进一步扩展,可以加入更多功能(如限流、统计等)。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐