C# Lock 实例锁和静态锁区别
Lock 实例锁和静态锁区别
public class SharedResource
{
private readonly object lockObject = new object();
private readonly static object lockstaticObject = new object();
static int counter = 0;
public int IncrementCounter()
{
lock (lockObject)
{
Console.WriteLine(counter.ToString());
counter++;
return counter;
}
}
public int IncrementCounter2()
{
lock (lockstaticObject)
{
Console.WriteLine(counter.ToString());
counter++;
return counter;
}
}
}
internal class Program
{
static void Main(string[] args)
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 20; i++)
{
tasks.Add(
Task.Run(() =>
{
new SharedResource().IncrementCounter2();
})
);
}
Task.WhenAll(tasks).Wait();
}
这段代码中的 IncrementCounter
和 IncrementCounter2
两个方法都用于增加 counter
变量的值,并在每次增加后返回新的值。它们的主要区别在于用于同步的锁对象:
IncrementCounter
方法使用一个实例锁对象lockObject
。这意味着每次只有一个线程可以访问此方法。如果有其他线程试图同时访问此方法,它们将会被阻塞,直到当前线程完成此方法的执行。IncrementCounter2
方法使用一个静态锁对象lockstaticObject
。这意味着每次只有一个线程可以访问此静态方法,无论有多少实例。如果有其他线程试图同时访问此方法,它们将会被阻塞,直到当前线程完成此方法的执行。
使用实例锁和静态锁的区别在于,实例锁只锁当前实例,而静态锁会锁整个类型。因此,如果你创建了多个 SharedResource
实例,每个实例都有自己的 lockObject
,所以它们不会相互阻塞。然而,对于 IncrementCounter2
,由于它使用的是静态锁,所以即使你创建了多个 SharedResource
实例,其他线程试图访问任何实例的 IncrementCounter2
方法时都会被阻塞,直到第一个线程完成执行。
总结:静态锁的所范围很大。再合适的场景要使用不同的锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix