2021-09-28 20:43:04
一、栈和堆是什么程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方、以及如何存储都依赖于该数据项的类型。运行中的程序使用两个内存区域来存储数据:栈和堆。1、栈栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。栈存储几种类型的数据:某些类型变量的值、程序当前的执行环境、传递给方法的参数。栈的特点:(1)数据只能从栈的顶端插入和删除...
2021-09-28 20:40:51
引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址--也就是指向对象数据的内存地址。以下是值类型与引用类型的表: 我们来看下面一段代码:首先在类中声明一个class类,和一个struct结构,如图:并使用在程序入口调用它们,如图: 现在我们来看一看,它们在内存当中是如何存储的? 从这张图可以看出,class(类)实例化出来的对象,指向...
2021-09-28 20:22:28
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。上节说到lock锁关键字,它实际上是Monitor的语法糖。lock锁定的是一个内存地址的引用。lock必须锁定一个引用类型的变量。锁定的变量msdn推荐是下面这样的:private static readonly object lockobj = new object();这里为什么必须这样是有玄机的。我们...
2021-09-28 18:52:23
作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了。 而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们,微软为我们带来了强大的并行集合:System.Collections.Concurrent里面的各位仁兄们。 首先,咱们从一个经典的问题谈起。生产者消费者问题 这个问题是最为经典的多线程应用问...
2021-09-28 14:47:04
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。程序如下: private void button1_Click(object sender, EventArgs e)
{
var list1 = new List<int>();
for(int i=0;i<10000...
2021-09-28 14:17:17
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。运行源码后,执行button1 for (int i = 0; i < 5; i++)
{
var k = i;
//加上下面这句效果又不一样
Task.Run((...