首页 > 学院 > 开发设计 > 正文

线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁

2019-11-17 02:52:15
字体:
来源:转载
供稿:网友

线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁

当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了。本篇体验线程锁的各种用法以及线程死锁。主要包括:

※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.Exit处理数据同步※ 使用Mutex处理进程间数据同步※ 使用Semaphore处理数据同步※ 线程死锁

□ 使用lock处理数据同步

假设有一个类,主要用来计算该类2个字段的商,在计算商的方法之内让被除数自减,即被除数有可能为零。使用lock语句块保证每次只有一个线程进入该方法。

    class ThreadSafe
    {
        static readonly object o = new object();
        PRivate static int _val1, _val2;
        public ThreadSafe(int val1, int val2)
        {
            _val1 = val1;
            _val2 = val2;
        }
        public void Calculate()
        {
            lock (o)
            {
                --_val2;
                if (_val2 != 0)
                {
                    Console.WriteLine(_val1/_val2);
                }
                else
                {
                    Console.WriteLine("_val2为零");
                }
                
            }
        }
    }

○ new object()创建的对象实例,也被称作同步对象○ 同步对象必须是引用类型○ 同步对象通常是私有的、静态的

客户端有一个静态字段val2被ThreadSafe的2个实例方法共用。

    class Program
    {
        private static int val2 = 2;
        static void Main(string[] args)
        {
            ThreadSafe ts1 = new ThreadSafe(2, val2);
            ThreadSafe ts2 = new ThreadSafe(2, val2);
            Thread[] threads = new Thread[2];
            threads[0] = new Thread(ts1.Calculate);

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表