计算机系统应用教程网站

网站首页 > 技术文章 正文

C#面试题-锁 c# 锁

btikc 2024-10-12 10:47:22 技术文章 6 ℃ 0 评论

列举常用的锁

  1. SemaphoreSlim:轻量级的信号量,用于控制同时访问资源的线程数量。
  2. ManualResetEventSlim:手动重置事件,用于线程间的信号通知和同步。
  3. ReaderWriterLockSlim:读写锁,允许多个线程同时读取共享资源,但只允许一个线程写入资源;通过EnterReadLock和EnterWriteLock方法获取读锁和写锁,通过ExitReadLock和ExitWriteLock方法释放锁。
  4. Mutex:互斥锁,用于控制对共享资源的访问,确保只有一个线程可以访问资源。
  5. AutoResetEvent:自动重置事件,用于线程间的信号通知和同步。


lock是一种什么样的锁?

lock是一个混合锁,lock关键字提供了一种简单的方式来实现对对象的互斥访问,其实质是Monitor,lock关键字会自动获取对象的锁,并在作用域结束时释放,确保临界区代码的互斥执行。

using System;

using System.Threading;

class Program
{

private static object lockObject = new object(); // 定义一个对象作为锁


static void Main()

{

for (int i = 1; i <= 5; i++)

{

Thread thread = new Thread(() => AccessSharedResource(i));
thread.Start();

}

}

static void AccessSharedResource(int threadId)

{

lock (lockObject) // 使用lock关键字获取对象的锁

{

Console.WriteLine(#34;Thread {threadId} is accessing the shared resource.");

Thread.Sleep(1000); // 模拟处理资源的时间

Console.WriteLine(#34;Thread {threadId} released the shared resource.");

}

}

}


什么是死锁?

死锁:

当多个线程同时持有一些资源,并且每个线程都在等待其他线程释放资源时,就可能发生死锁。最终导致程序无法继续执行,严重影响程序的性能和稳定。

死锁常见的情形:

  • 互斥等待:多线程同时持有某些资源,并且每个线程在等待其他线程释放资源时形成循环等待。
  • 资源竞争:多线程竞争有限的资源,当资源分配不当时可能会导致死锁
  • 嵌套锁:线程已经持有一个锁的同时尝试获取另外一个锁,可能导致死锁。


避免死锁的措施:

  • 使用超时机制:在获取锁时设置超时时间,避免长时间的等待造成死锁。
  • 按顺序获取锁:确保线程获取锁的顺序是一致的,避免循环等待。
  • 避免嵌套锁:尽量避免在持有一个锁的情况下尝试获取另外一个锁。
  • 避免资源竞争:合理设计资源的分配和释放策略,避免资源争夺导致死锁。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表