多线程编程时,如果涉及同时读写共享数据,就要格外小心.如果共享数据是独占资源,则要对共享数据的读写进行排它访问,最简单的方式就是加锁.锁也不能随便用,否则可能会造成死锁和活锁.本文将通过示例详细讲解死锁和活锁是如何发生的​,以及如何避免它们.​ 避免多线程同时读写共享数据 在实际开发中,难免会遇到多线程读写共享数据的需求.比如在某个业务处理时,先获取共享数据(比如是一个计数),再利用共享数据进行某些计算和业务处理,最后把共享数据修改为一个新的值.由于是多个线程同时操作,某个线程取得共享数据后,紧…
大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的语言而只是在现有的语言基础上来实现,所以叫语言集成查询. 一些基础 在 C# 中,从功能上 LINQ 可分为两类:LINQ to Object 和 L…
死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁. 举个例子,A同学抢了B同学的钢笔,B同学抢了A同学的书,两个人都相互占用对方的东西,都在让对方先还给自己自己再还,这样一直争执下去等待对方还而又得不到解决,老师知道此事后就让他们相互还给对方,这样在外力的干预下他们才解…
阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以在中文的概念中,运算符是操作符的一个子集. 操作符是很基础的知识了,基础归基础,我们来回顾一下 C# 操作符那些比较骚的操作,能想到的不多,请大家补充. 操作符的重载 操作符重载大部分语言都没有,而 C# 有.C# 允许用户定义类型对操作符进行重载,方式是使用 operate 关键字把操作符写成公开…
大家好,这是[C#.NET 拾遗补漏]专辑的第 06 篇文章.今天讲讲大家熟悉的单例模式. 单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式. 单例模式的实现分为两种:饿汉式和懒汉式.前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化.两者有各自适用的场景,实现方式也都很简单,唯一在设计时要考虑的一个问题就是:实例化时需要保证线程安全. 饿汉式 饿汉式实现很简单,在静态构造函数中立即进行实例化: publi…
大家好,这是 [C#.NET 拾遗补漏] 系列的第 07 篇文章. 在 C# 中,大多数方法都是通过 return 语句立即把程序的控制权交回给调用者,同时也会把方法内的本地资源释放掉.而包含 yield 语句的方法则允许在依次返回多个值给调用者的期间保留本地资源,等所有值都返回结束时再释放掉本来资源,这些返回的值形成一组序列被调用者使用.在 C# 中,这种包含 yield 语句的方法.属性或索引器就是迭代器. 迭代器中的 yield 语句分为两种: yeild return,把程序控制权交回调…
目录 1.概览 2.死锁 2.1.什么是死锁 2.2 死锁举例 2.3 避免死锁 3.活锁 3.1 什么是活锁 3.2 活锁举例 3.3 避免活锁 1.概览 当多线程帮助我们提高应用性能的同时,它同时也带来一些问题,本文我们将借助几个小例子看下两个问题,死锁和活锁. 2.死锁 2.1.什么是死锁 死锁发生在当两个或多个线程一直在等待另一个线程持有的锁或资源的时候.这会导致一个程序可能会被拖垮或者直接挂掉,因为线程们都不能继续工作了. 经典的哲学家进餐问题非常好的展示了多线程下的同步问题并且经常被…
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们将无法推进下去: 活锁:是指两个线程优先级相同,都礼让不走,就这样一直僵持下去: 饿死:在单线程情况下,A.B两个线程,A先执行:A在执行过程中,C线程来了,B让C先执行:C在执行过程中,D线程来了,B也让D先执行,就这样B一直都是等待状态. 竞态条件:多个线程竞争同一个变量,导致数据的不正确性,线程的访问顺序是不可控的,会影响最终的结果. 产生死锁的必要条件: 1.互斥使用(资源独占)…
阅读本文大概需要 1.5 分钟. 数组本身相对来说比较简单,能想到的可写的东西不多.但还是有一些知识点值得总结和知晓一  下.有的知识点,知不知道不重要,工作中用的时候搜索一下就可以了,毕竟实现一个功能代码的写法有很多种,再牛的人也不可能完全熟悉一门语言的每个细节.当然了,偶然地知道了一些小知识或小技巧也是一种小小的收获.在你看这篇小文时,或许这种偶然的事情就正在发生.我们先从数组的初始化开始吧. 数组的定义和初始化 定义和初始化一个数组有好几种方式,随着 C# 版本升级,方式也越来越简单: i…
字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点. 逐字字符串 在普通字符串中,反斜杠字符是转义字符.而在逐字字符串(Verbatim Strings)中,字符将被编程器按照原义进行解释.使用逐字字符串只需在字符串前面加上 @ 符号. // 逐字字符串:转义符var filename = @"c:\temp\newfile.txt";Console.WriteLine(filenaame); // 逐字字符串:多行文本va…