C# Thread Lock 笔记
2024-10-18 07:14:22
多线程, 当使用共有变量时, 保持计算结果正确很重要:
看下面的例子:
private static int count = ;
//private static object objlock = new object(); public static void Main(string[] args)
{
try
{
for (int i = ; i < ; i++)
{
Thread t1 = new Thread(new ThreadStart(WriteNumber));
t1.Name = "Name-" + i.ToString();
t1.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} Console.ReadLine();
} public static void WriteNumber()
{
//lock (objlock)
//{
count--;
Thread.Sleep();
Console.WriteLine("Name:" + Thread.CurrentThread.Name + " count:" + count.ToString());
//}
}
结果这样,全错了。
加上lock之后, 代码修改为这样
private static int count = ;
private static object objlock = new object(); public static void Main(string[] args)
{
try
{
for (int i = ; i < ; i++)
{
Thread t1 = new Thread(new ThreadStart(WriteNumber));
t1.Name = "Name-" + i.ToString();
t1.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} Console.ReadLine();
} public static void WriteNumber()
{
lock (objlock)
{
count--;
Thread.Sleep();
Console.WriteLine("Name:" + Thread.CurrentThread.Name + " count:" + count.ToString());
}
}
运行结果是这样:
注意:private static object objlock = new object(); //定义这个变量的位置,
各线程运行先后, 由CPU随机执行, 每次运行都可能看到不同的先后顺序。
最新文章
- 每天一个linux命令(49):at命令
- Windows Store App 全球化:引用类库资源
- avalon2.2.3发布
- 如何使用 Migration创建一个迁移
- myeclipse中working Sets
- agile学习
- GPUImage 滤镜头文件
- Prefixes and Suffixes
- Thanks
- sql 根据字段查询不同表
- Java实现的高效计数器
- NFS文件共享
- Nova控制节点集群
- xamarin android listview的用法
- Office远程代码执行漏洞(CVE-2017-11882)复现
- 【Linux】常见基础命令之文件操作
- postgresql 日志配置
- JVM虚拟机深入理解+GC回收+类加载
- JS对象与Dom对象与jQuery对象之间的区别
- 【Maven】eclipse中使用Maven、生命周期