同步线程1(lock)

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”中针对这个类所提供的机制将进行详细的说明。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值