设为首页 加入收藏

TOP

多线程编程学习笔记-基础(三)(二)
2019-09-03 00:12:07 】 浏览:45
Tags:线程 编程 学习 笔记 基础
} }
abstract class CountBase { public abstract void Incerement(); public abstract void Dncerement(); } class Counter : CountBase { public int Count { get; private set; } public override void Dncerement() { Count--; } public override void Incerement() { Count++; } } class CounterLock : CountBase { private readonly object objSync = new object(); public int Count { get; private set; } public override void Dncerement() { lock (objSync) { Count--; } } public override void Incerement() { lock (objSync) { Count++; } } } }

2. 结果如下图

 

      主线程首先创建了一个 Counter的实例对象,这个类定义了一个可以增,可以 减的简单计数器。然后我们创建了三个线程,这三个线程共享一个Counter对象。由于没有对共享变量的锁定,所以在一个周期内,对共享变量的改变,在上个线程没结束之前,当前线程又对共享变量进行了操作,我们会得到不同的计数值,如上图所示。为了防止这种情况的发生,所以我们要对共享变量进行加锁。使用lock关键字锁定对象,这样在一个线程操作完成之前,其他线程都不能对共享变量进行操作。

 

十一、Moniter对资源的锁定

 1.代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; //引入线程
using System.Diagnostics; 

namespace ThreadConsoleApp
{   
 class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("开始,线程死锁");          

            var lock1 = new object();
            var lock2 = new object();
           

            Thread t = new Thread(()=> DeadLock(lock1,lock2));
            t.Name = "线程1";       

            //启动线程

            t.Start();
            lock (lock2)
            {
                Thread.Sleep(2000); 

                if (Monitor.TryEnter(lock1,TimeSpan.FromSeconds(5)))

                {
                    Console.WriteLine("在规定时间内,请求资源");

                }
                else

                {
                    Console.WriteLine("超时,无法获取资源");

                }
            }

            new Thread(() => DeadLock(lock1, lock2)).Start();
             Console.WriteLine("-----------------------------");

            lock (lock2)
            {

                Thread.Sleep(1000);
                Console.WriteLine(string.Format("死锁线程"));

               lock(lock1)
                {
                    Console.WriteLine("请求资源成功");

                }          
           }

            Console.Read();
        }
      

        /// <summary>
        /// 死锁方法
        /// </summary>
        /// <param name="objLock1"></param>
        /// <param name="objLock2"></param>
        static void DeadLock(object objLock1,object objLock2)
        {
            lock (objLock1)
            {
                Thread.Sleep(2000);
                lock (objLock2)
                {
                    Console.WriteLine("死锁");
                }
            }
        }
    }
}

2.结果如下图

 

 先看deadlock方法,这个方法先锁定lock1对象,然后等待2秒之后,锁定了lock2对象。然后在子线程中启动了这个方法。

主线程中先锁定了lock2对象,然后等待获取lock1对象。由于子线程锁定了lock1对象,等待lock2对象。所以造成了死锁。

 

十二、多线程的异常处理

 1.代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; //引入线程
using System.Diagnostics;
 
namespace ThreadConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("开始,异常处理");          
            Thread t = new Thread(FaultyThread);
            t.Name = "线程1";        

            //启动线程
            t.Start();
            t.Join();
            try
            {
                t = new Thread(ExpectThread);
                t.Start();
            }

            catch (Exception ex)
            {
                Console.WriteLine("异常信息:" + ex.Message);
            }
            Console.Read();
        }    

        static void ExpectThread()
        {
            Console.WriteLine(string.Format("异常处理"));
            Thread.Sleep(2000);
            throw new Exception("抛出异常");
        }
        static void FaultyThread()
        {
            try
            {
                Console.WriteLine(string
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2017年10月21日 CSS常用样式&鼠标.. 下一篇先记下这些小毛病,后面在慢慢回..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目