• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#多线程编程中的锁系统基本用法

C#多线程编程中的锁系统基本用法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#多线程编程实例,c#多线程编程,c#多线程同步,c#多线程实例,c#多线程教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

平常在多线程开发中,总避免不了线程同步。本篇就对net多线程中的锁系统做个简单描述。

目录
一:lock、Monitor
     1:基础。
     2: 作用域。
     3:字符串锁。
     4:monitor使用
二:mutex
三:Semaphore
四:总结

一:lock、Monitor

1:基础

Lock是Monitor语法糖简化写法。Lock在IL会生成Monitor。
//======Example 1=====
            string obj = "helloworld";
            lock (obj)
            {
                Console.WriteLine(obj);
            }
            //lock  IL会编译成如下写法
            bool isGetLock = false;
            Monitor.Enter(obj, ref isGetLock);
            try
            {
                Console.WriteLine(obj);
            }
            finally
            {
                if (isGetLock)
                {
                    Monitor.Exit(obj);
                }
            }
</div>

isGetLock参数是Framework  4.0后新加的。 为了使程序在所有情况下都能够确定,是否有必要释放锁。例: Monitor.Enter拿不到锁

Monitor.Enter 是可以锁值类型的。锁时会装箱成新对象,所以无法做到线程同步。

2:作用域

     一:Lock是只能在进程内锁,不能跨进程。走的是混合构造,先自旋再转成内核构造。

     二:关于对type类型的锁。如下:
//======Example 2=====
            new Thread(new ThreadStart(() => {
                lock (typeof(int))
                {
                    Thread.Sleep(10000);
                    Console.WriteLine("Thread1释放");
                }
            })).Start();
            Thread.Sleep(1000);
            lock(typeof(int))
            {
                Console.WriteLine("Thread2释放");
            }
</div>

运行结果如下:

我们在来看个例子。
//======Example 3=====
            Console.WriteLine(DateTime.Now);
            AppDomain appDomain1 = AppDomain.CreateDomain("AppDomain1");
            LockTest Worker1 = (LockTest)appDomain1.CreateInstanceAndUnwrap(
             Assembly.GetExecutingAssembly().FullName,
             "ConsoleApplication1.LockTest");
            Worker1.Run();

            AppDomain appDomain2 = AppDomain.CreateDomain("AppDomain2");
            LockTest Worker2 = (LockTest)appDomain2.CreateInstanceAndUnwrap(
            Assembly.GetExecutingAssembly().FullName,
            "ConsoleApplication1.LockTest");
            Worker2.Run();
/// <summary>
    /// 跨应用程序域边界或远程访问时需要继承MarshalByRefObject
    /// </summary>
    public class LockTest : MarshalByRefObject
    {
        public void Run()
        {
            lock (typeof(int))
            {
                Thread.Sleep(10000);
                Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + ": Thread 释放," + DateTime.Now);
            }
        }
    }
</div>

运行结果如下:

第一个例子说明,在同进程同域,不同线程下,锁type int,其实锁的是同一个int对象。所以要慎用。

第二个例子,这里就简单说下。

      A: CLR启动时,会创建 系统域(System Domain)和共享域(Shared Domain), 默认程序域(Default AppDomain)。 系统域和共享域是单例的。程序域可以有多个,例子中我们使用AppDomain.CreateDomain方法创建的。

      B:  按正常来说,每个程序域的代码都是隔离,互不影响的。但对于一些基础类型来说,每个程序域都重新加载一份,就显得有点浪费,带来额外的损耗压力。聪明的CLR会把一些基本类型Object, ValueType, Array, Enum,

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#多线程编程详解
  • C#制作多线程处理强化版网络爬虫
  • C#模式画刷HatchBrush用法实例
  • C#纹理画刷TextureBrush用法实例
  • c#实现多线程局域网聊天系统
  • C#选择法排序实例分析
  • C#使用动态规划解决0-1背包问题实例分析
  • C#多线程编程中的锁系统(四):自旋锁
  • C#多线程编程中的锁系统(三)
  • C#多线程编程中的锁系统(二)

相关文章

  • 2017-05-28C#实现向多线程传参的三种方式实例分析
  • 2017-05-28c#泛型学习详解 创建线性链表
  • 2017-05-28C# 动态加载程序集信息
  • 2017-05-28C#百万数据查询出现超时问题的解决方法
  • 2017-05-28C# 键值对数据排序代码
  • 2017-05-28asp.net中XML如何做增删改查操作
  • 2017-05-28C# WinForm国际化实现的简单方法
  • 2017-05-28C#读写文本文件的方法
  • 2017-05-28C#中数组初始化、反转和排序用法实例
  • 2017-05-28C#连接数据库和更新数据库的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#关于反射加载的问题
    • C#窗体全屏功能实例代码
    • C#形状原点变换的方法
    • c#裁剪图片后使用zxing生成二维码示例分享
    • C# 7.0之ref locals and returns(局部变量和引用返回)
    • C# 基础入门--常量
    • C#中的let字句应用示例
    • C#操作FTP出现500错误解决办法
    • C#实现漂亮的数字时钟效果
    • 对c#中委托的理解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有