多线程-线程同步
Posted 小何同学_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-线程同步相关的知识,希望对你有一定的参考价值。
线程同步:协调多个线程间的并发操作,以获得符合预期的,确定的执行结果,消除多线程应用程序的不确定性.
使用线程的同步:可以保护资源同时只能由一个线程访问,一般采取的措施是获取锁,释放锁。即锁机制;可以协调线程的访问顺序,即某一资源只能先由线程A访问,再由线程B进行访问。
class Program
{
private static Thread subthread ;
private static int i;
static void Main(string[] args)
{
subthread = new Thread(new ThreadStart(GetShow));
subthread.Start(); //开启线程
GetShow();
//Console.WriteLine("{0}后台线程", Thread.CurrentThread.Name+Thread.CurrentThread.IsBackground+",结束");
}
static void GetShow()
{
Console.WriteLine(i);
i++;
//Console.WriteLine(i);
}
}
上面的代码执行时候,出现了两个线程同时访问同一个资源,向控制台输出后去执行i++操作,这样两个线程进来那一时间,i的值没有发生改变依旧是0,但执行i++后的值发生了改变,注释掉下面的输出运行程序发现:先输出2后输出的是1,这也是线程的执行顺序不确定而造成的值的输出顺序有差异。
使用排他锁,通过Monitor进行资源保护
1.使用对象作为锁对象:
class Program
{
private static Thread subthread ;
private static int i;
private static object obj = new object();
static void Main(string[] args)
{
Thread.CurrentThread.Name = "主";
subthread = new Thread(new ThreadStart(GetShow));
subthread.Name = "subject";
subthread.Start(); //开启线程
GetShow();
//Console.WriteLine("{0}后台线程", Thread.CurrentThread.Name+Thread.CurrentThread.IsBackground+",结束");
}
static void GetShow()
{
Monitor.Enter(obj);// 在指定对象上获取排他锁。
Console.WriteLine(Thread.CurrentThread.Name+">>"+i);
i++;
Console.WriteLine(Thread.CurrentThread.Name+">>"+i);
Monitor.Exit(obj); // 释放指定对象上的排他锁。
}
}
以上是关于多线程-线程同步的主要内容,如果未能解决你的问题,请参考以下文章