版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/84673680
在多线程编程中,当多个线程共享数据和资源时,根据主线程调度机制,线程将在没有警告的情况下中断和继续,因此多线程处理存在资源共享和同步问题。
多线程同步:在任一时刻,只允许一个线程访问资源。
上下文是一组有序的属性或规则。这组属性或规则将类似的对象绑定在一起,同步上下文策略就是使用.Net提供的SynchronizationAttribute类的构造函数对驻留在上下文中、符合上下文规则的对象启用简单的自动同步,确保同一时刻只有一个线程可以访问该对象。值得注意的是,该策略不处理静态字段和方法的同步。
可以使用SynchronizationAttribute属性,为ContextBoundObject的派生对象启用简单自动的同步,该属性为当前上下文和所有共享同一实例的上下文强行创建一个同步域。该属性应用于某一个对象时,在共享该属性实例的所有上下文中只有一个线程执行,多个线程可以访问访问方法和字段。但在任一时刻只允许一个线程访问。
用两个线程对Counter类的字段count进行访问,一个用于读,一个用于写。
运行结果:
同步前
同步后:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Contexts;
namespace Test1_1
{
class HelloWorld
{
static void Main(string[] args)
{
Counter c = new Counter();
Thread reader = new Thread(new ThreadStart(c.Read)); //创建读线程
reader.Name = "读线程"; //创建线程名
Thread writer = new Thread(new ThreadStart(c.Write)); //创建写线程
writer.Name = "写线程"; //创建线程名
reader.Start();
writer.Start();
Console.Read();
}
}
[Synchronization] //设置上下文
public class Counter : ContextBoundObject
{
private int count = 42;
public void Read() //读取count的值
{
for (int i = 1; i < 5; ++i)
{
Console.WriteLine("{0}:count = {1}", Thread.CurrentThread.Name, count);
}
}
public void Write() //修改count的值
{
for (int i = 1; i < 5; ++i)
{
++count;
Console.WriteLine("{0}:count = {1}", Thread.CurrentThread.Name, count);
}
}
}
}
使用同步上下文时,要注意,只有成员字段和成员方法被同步,而静态方法和字段不被保护,允许多个线程同时访问。