多线程-线程同步

Posted 小何同学_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-线程同步相关的知识,希望对你有一定的参考价值。

线程同步:协调多个线程间的并发操作,以获得符合预期的,确定的执行结果,消除多线程应用程序的不确定性.

使用线程的同步:可以保护资源同时只能由一个线程访问,一般采取的措施是获取锁,释放锁。即锁机制;可以协调线程的访问顺序,即某一资源只能先由线程A访问,再由线程B进行访问。

    class Program
    {
        private static Thread subthread ;
        private static int i;
        static void Main(string[] args)
        {
            subthread = new Thread(new ThreadStart(GetShow));
            subthread.Start();   //开启线程
            GetShow();
            //Console.WriteLine("{0}后台线程", Thread.CurrentThread.Name+Thread.CurrentThread.IsBackground+",结束");
        }
        static void GetShow()
        {
            Console.WriteLine(i);
            i++;
            //Console.WriteLine(i);
        }
    }

上面的代码执行时候,出现了两个线程同时访问同一个资源,向控制台输出后去执行i++操作,这样两个线程进来那一时间,i的值没有发生改变依旧是0,但执行i++后的值发生了改变,注释掉下面的输出运行程序发现:先输出2后输出的是1,这也是线程的执行顺序不确定而造成的值的输出顺序有差异。


使用排他锁,通过Monitor进行资源保护

1.使用对象作为锁对象:

 class Program
    {
        private static Thread subthread ;
        private static int i;
        private static object obj = new object();
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "主";
            subthread = new Thread(new ThreadStart(GetShow));
            subthread.Name = "subject";
            subthread.Start();   //开启线程
            GetShow();
            //Console.WriteLine("{0}后台线程", Thread.CurrentThread.Name+Thread.CurrentThread.IsBackground+",结束");
        }
        static void GetShow()
        {
            Monitor.Enter(obj);// 在指定对象上获取排他锁。
            Console.WriteLine(Thread.CurrentThread.Name+">>"+i);
            i++;
            Console.WriteLine(Thread.CurrentThread.Name+">>"+i);
            Monitor.Exit(obj); // 释放指定对象上的排他锁。
        }
    }


以上是关于多线程-线程同步的主要内容,如果未能解决你的问题,请参考以下文章

起底多线程同步锁(iOS)

线程同步-使用ReaderWriterLockSlim类

详解C++多线程

进程线程同步异步

java基础入门-多线程同步浅析-以银行转账为样例

Java多线程——Lock&Condition