线程同步-同步代码区

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/84674243

该策略只对特定的代码区域进行同步操作。这些特定的代码区一般多为方法中重要的代码段。除了可以同步实例方法外,该策略还可以对静态方法实施同步。.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("退出代码同步区域");
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/84674243
今日推荐