1.多线程的应用程序经常会遇到不同线程使用同一份资源的情形,例如数据库应用程序经常遇到不同的客户端用户,同时对数据库里的同一笔数据进行存取操作,当你尝试删除一笔其他用户正在修改的数据时,此时就会发生数据存取冲突;同样,当一个应用程序里存在多个线程的时候,对于资源的存取也会有相同情形,在这种状况下,你必须协调这些独立线程,这样的操作被称为线程的同步化。
2.同步线程在资源一次只能由一个线程存取的时候特别重要,这可以避免同时存取一份资源所造成的冲突,C#利用lock语句完成这一类的操作,用以控制某段程序代码对特定资源的存取,当这份资源由某个线程进行存取的时候,其他线程将没有权限可以存取这份资源,直到其被释放。
3.lock的语法如下:
lock(objlock)
{
//同步化执行相关程序代码……
}
其中的objlock为所要锁定的对象,而其中则为所要封锁的执行程序代码,一是于某个程序执行,objlock对象会被锁住直到其中的程序代码执行完毕,当这个锁定被释放之后,其他的线程才能够继续执行。
4.范例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication20
{
class Program
{
static Thread[] threads=new Thread[3];
int addsum = 0;
static void Main(string[] args)
{
Program p = new Program();
for (int i = 0; i < 3;i++ )
{
threads[i] = new Thread(new ThreadStart(p.doSum)); //定义线程
threads[i].Name = "线程" + i;
}
for (int i = 0; i < 3; i++)
{
threads[i].Start(); //启动线程
}
for (int i = 0; i < 3; i++)
{
threads[i].Join();
}
Console.WriteLine("over!");
Console.Read();
}
public void doSum()
{
for (int i = 0; i < 10; i++)
{
lock(this) //this表示锁定的对象,此范例为线程本身存在的类,所以使用关键字this
{
addsum += 2;
Console.Write(Thread.CurrentThread.Name + "执行第" + i + "次操作--->");
Thread.Sleep(1);
Console.WriteLine(Thread.CurrentThread.Name + "执行第" + i + "次操作,addsum=" + addsum);
}
}
}
}
}
注:lock用于防止多个线程同时存取同一份资源,是个不错的方式,然而,当你想要对资源存取进行较为复杂的控制时,lock显然是不足的。此时我们必须考虑使用另外一类Monitor,这个类当你想要对多个线程进行复杂控制的时候,是一个比较合适的选择,在“同步线程2”中针对这个类所提供的机制将进行详细的说明。
2.同步线程在资源一次只能由一个线程存取的时候特别重要,这可以避免同时存取一份资源所造成的冲突,C#利用lock语句完成这一类的操作,用以控制某段程序代码对特定资源的存取,当这份资源由某个线程进行存取的时候,其他线程将没有权限可以存取这份资源,直到其被释放。
3.lock的语法如下:
lock(objlock)
{
//同步化执行相关程序代码……
}
其中的objlock为所要锁定的对象,而其中则为所要封锁的执行程序代码,一是于某个程序执行,objlock对象会被锁住直到其中的程序代码执行完毕,当这个锁定被释放之后,其他的线程才能够继续执行。
4.范例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication20
{
class Program
{
static Thread[] threads=new Thread[3];
int addsum = 0;
static void Main(string[] args)
{
Program p = new Program();
for (int i = 0; i < 3;i++ )
{
threads[i] = new Thread(new ThreadStart(p.doSum)); //定义线程
threads[i].Name = "线程" + i;
}
for (int i = 0; i < 3; i++)
{
threads[i].Start(); //启动线程
}
for (int i = 0; i < 3; i++)
{
threads[i].Join();
}
Console.WriteLine("over!");
Console.Read();
}
public void doSum()
{
for (int i = 0; i < 10; i++)
{
lock(this) //this表示锁定的对象,此范例为线程本身存在的类,所以使用关键字this
{
addsum += 2;
Console.Write(Thread.CurrentThread.Name + "执行第" + i + "次操作--->");
Thread.Sleep(1);
Console.WriteLine(Thread.CurrentThread.Name + "执行第" + i + "次操作,addsum=" + addsum);
}
}
}
}
}
注:lock用于防止多个线程同时存取同一份资源,是个不错的方式,然而,当你想要对资源存取进行较为复杂的控制时,lock显然是不足的。此时我们必须考虑使用另外一类Monitor,这个类当你想要对多个线程进行复杂控制的时候,是一个比较合适的选择,在“同步线程2”中针对这个类所提供的机制将进行详细的说明。