该策略只对特定的代码区域进行同步操作。这些特定的代码区一般多为方法中重要的代码段。除了可以同步实例方法外,该策略还可以对静态方法实施同步。.Net提供了很多类用于支持同步代码区。
Moniter类用于同步代码区,其思想是首先使用Monitor.Enter()方法获得一个锁,然后使用Moniter.Exit()方法释放该锁。一个线程一旦获得重要代码区的锁,其他线程只有等到该锁被释放后才能使用该代码区。这样就能通过同步最少量的代码,实现最大程度的并发。
运行结果:
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();
}
}
public class Counter
{
private int count = 42;
public void Read() //读取count的值
{
Monitor.Enter(this); //加上Monitor锁
Console.WriteLine("进入代码同步区域");
for (int i = 1; i < 5; ++i)
{
Console.WriteLine("{0}:count = {1}", Thread.CurrentThread.Name, count);
}
Console.WriteLine("退出代码同步区域");
Monitor.Exit(this); //释放Monitor锁
}
public void Write() //修改count的值
{
Monitor.Enter(this); //加上Monitor锁
Console.WriteLine("进入代码同步区域");
for (int i = 1; i < 5; ++i)
{
++count;
Console.WriteLine("{0}:count = {1}", Thread.CurrentThread.Name, count);
}
Console.WriteLine("退出代码同步区域");
Monitor.Exit(this); //释放Monitor锁
}
}
}
C#中的Lock关键字
使用C#中lock关键字同一可以获得一个Monitor锁,这是,只需要简单的用Lock语句将需要同步的代码括起来。这里,括号表示受保护代码的起始点和终止点。
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();
}
}
public class Counter
{
private int count = 42;
public void Read() //读取count的值
{
lock(this)
{
Console.WriteLine("进入代码同步区域");
for (int i = 1; i < 5; ++i)
{
Console.WriteLine("{0}:count = {1}", Thread.CurrentThread.Name, count);
}
Console.WriteLine("退出代码同步区域");
}
}
public void Write() //修改count的值
{
lock (this)
{
Console.WriteLine("进入代码同步区域");
for (int i = 1; i < 5; ++i)
{
++count;
Console.WriteLine("{0}:count = {1}", Thread.CurrentThread.Name, count);
}
Console.WriteLine("退出代码同步区域");
}
}
}
}