当前位置: 首页 > news >正文

网站建设是属于虚拟产品吗淘宝客wordpress引流

网站建设是属于虚拟产品吗,淘宝客wordpress引流,免费建站源码,怎么开网店不用自己发货囤货的一. 四大并发集合类 背景#xff1a;我们目前使用的所有集合都是线程不安全的 。 A. ConcurrentBag#xff1a;就是利用线程槽来分摊Bag中的所有数据#xff0c;链表的头插法,0代表移除最后一个插入的值. (等价于同步中的List) B. ConcurrentStack#xff1a;线程安全的St…一. 四大并发集合类 背景我们目前使用的所有集合都是线程不安全的 。 A. ConcurrentBag就是利用线程槽来分摊Bag中的所有数据链表的头插法,0代表移除最后一个插入的值. (等价于同步中的List) B. ConcurrentStack线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁. (等价于同步中的数组) C. ConcurrentQueue: 队列的模式先进先出 (等价于同步中的队列) D. ConcurrentDictionary: 字典的模式 (等价于同步中的字典) 以上四种安全的并发集合类也可以采用同步版本Lock锁(或其它锁)来实现 代码实践 01-ConcurrentBag{Console.WriteLine(---------------- 01-ConcurrentBag ---------------------);ConcurrentBagint bag new ConcurrentBagint();bag.Add(1);bag.Add(2);bag.Add(33);//链表的头插法,0代表移除最后一个插入的值var result 0;//flag为true表示移除成功并且返回被移除的值var flag bag.TryTake(out result);Console.WriteLine(移除的值为{0}, result);}#endregion02-ConcurrentStack{Console.WriteLine(---------------- 02-ConcurrentStack ---------------------);ConcurrentStackint stack new ConcurrentStackint();stack.Push(1);stack.Push(2);stack.Push(33);//链表的头插法,0代表移除最后一个插入的值var result 0;//flag为true表示移除成功并且返回被移除的值var flag stack.TryPop(out result);Console.WriteLine(移除的值为{0}, result);}#endregion03-ConcurrentQueue{Console.WriteLine(---------------- 03-ConcurrentQueue ---------------------);ConcurrentQueueint queue new ConcurrentQueueint();queue.Enqueue(1);queue.Enqueue(2);queue.Enqueue(33);//队列的模式先进先出0代表第一个插入的值var result 0;//flag为true表示移除成功并且返回被移除的值var flag queue.TryDequeue(out result);Console.WriteLine(移除的值为{0}, result);}#endregion04-ConcurrentDictionary{Console.WriteLine(---------------- 04-ConcurrentDictionary ---------------------);ConcurrentDictionaryint, int dic new ConcurrentDictionaryint, int();dic.TryAdd(1, 10);dic.TryAdd(2, 11);dic.TryAdd(3, 12);dic.ContainsKey(3);//下面是输出字典中的所有值foreach (var item in dic){Console.WriteLine(item.Key item.Value);}}#endregion 代码结果 二. 队列的综合案例 上面介绍了四大安全线程集合类和与其对应的不安全的线程集合类可能你会比较疑惑到底怎么安全了那些不安全的集合类怎么能变成安全呢下面以队列为例来解决这些疑惑。 1. 测试Queue队列并发情况下是不安全的(存在资源竞用的问题)ConcurrentQueue队列在并发情况下是安全的。 2. 利用Lock锁Queue队列实现多线程并发情况下的安全问题即等同于ConcurrentQueue队列的效果。 经典案例测试开启100个线程进行入队操作正常所有的线程执行结束后队列中的个数应该为100. ①. Queue不加锁的情况结果出现99、98、100显然是出问题了。 {Queue queue new Queue();object o new object();int count 0;ListTask taskList new ListTask();for (int i 0; i 100; i){var task Task.Run(() {queue.Enqueue(count);});taskList.Add(task);}Task.WaitAll(taskList.ToArray());//发现队列个数在不加锁的情况下 竟然不同 有100有99Console.WriteLine(Queue不加锁的情况队列个数 queue.Count);} ②. Queue加锁的情况结果全是100显然是正确的。 1 {2 Queue queue new Queue();3 object o new object();4 int count 0;5 ListTask taskList new ListTask();6 for (int i 0; i 100; i)7 {8 var task Task.Run(() 9 { 10 lock (o) 11 { 12 queue.Enqueue(count); 13 } 14 }); 15 taskList.Add(task); 16 } 17 18 Task.WaitAll(taskList.ToArray()); 19 //发现队列个数在全是100 20 Console.WriteLine(Queue加锁的情况队列个数 queue.Count); 21 } ③. ConcurrentQueue不加锁的情况结果全是100显然是正确同时证明ConcurrentQueue队列本身就是线程安全的。 1 {2 ConcurrentQueueint queue new ConcurrentQueueint();3 object o new object();4 int count 0;5 ListTask taskList new ListTask();6 7 for (int i 0; i 100; i)8 {9 var task Task.Run(() 10 { 11 queue.Enqueue(count); 12 }); 13 taskList.Add(task); 14 } 15 Task.WaitAll(taskList.ToArray()); 16 //发现队列个数不加锁的情形也全是100证明ConcurrentQueue是线程安全的 17 Console.WriteLine(ConcurrentQueue不加锁的情况下队列个数 queue.Count); 18 } 3. 在实际项目中如果使用队列来实现一个业务该队列需要是全局的这个时候就需要使用单例(ps单例是不允许被实例化的可以通过单例类中的属性或者方法的形式来获取这个类)同时队列的入队和出队操作如果使用Queue队列需要配合lock锁来解决多线程下资源的竞用问题。 经典案例开启100个线程对其进行入队操作然后主线程输入队列的个数并且将队列中的内容输出. 结果队列的个数为100输出内容1-100依次输出。 1 /// summary2 /// 单例类3 /// /summary4 public class QueueUtils5 {6 /// summary7 /// 静态变量由CLR保证在程序第一次使用该类之前被调用而且只调用一次8 /// /summary9 private static readonly QueueUtils _QueueUtils new QueueUtils(); 10 11 /// summary 12 /// 声明为private类型的构造函数禁止外部实例化 13 /// /summary 14 private QueueUtils() 15 { 16 17 } 18 /// summary 19 /// 声明属性供外部调用此处也可以声明成方法 20 /// /summary 21 public static QueueUtils instanse 22 { 23 get 24 { 25 return _QueueUtils; 26 } 27 } 28 29 30 //下面是队列相关的 31 Queue queue new Queue(); 32 33 private static object o new object(); 34 35 public int getCount() 36 { 37 return queue.Count; 38 } 39 40 /// summary 41 /// 入队方法 42 /// /summary 43 /// param namemyObject/param 44 public void Enqueue(object myObject) 45 { 46 lock (o) 47 { 48 queue.Enqueue(myObject); 49 } 50 } 51 /// summary 52 /// 出队操作 53 /// /summary 54 /// returns/returns 55 public object Dequeue() 56 { 57 lock (o) 58 { 59 if (queue.Count 0) 60 { 61 return queue.Dequeue(); 62 } 63 } 64 return null; 65 } 66 67 } 1 {2 int count 1;3 ListTask taskList new ListTask();4 for (int i 0; i 100; i)5 {6 var task Task.Run(() 7 {8 QueueUtils.instanse.Enqueue(count);9 }); 10 taskList.Add(task); 11 } 12 13 Task.WaitAll(taskList.ToArray()); 14 //发现队列个数在全是100 15 Console.WriteLine(单例模式下队列个数 QueueUtils.instanse.getCount()); 16 17 //下面是出队相关的业务 18 while (QueueUtils.instanse.getCount() 0) 19 { 20 Console.WriteLine(出队 QueueUtils.instanse.Dequeue()); 21 } 22 } 。。。。。。。。。。。 三. 常见的几类性能调优 PS  1. 常见的一级事件CPU占用过高、死锁问题、内存爆满   a. CPU过高查看是否while(true)中的业务过于复杂导致cpu一直在高负荷运行。   b. 死锁问题乱用lock千万不要lock中再加lock多个lock重叠   c. 内存爆满字符串的无限增长全局的静态变量过多。 2. 补充几个常用的性能调优的方式   a. 使用字典类型DictionaryT,T代替只有两个属性的对象或匿名对象。   b. 使用数组代替只有两个属性的对象或匿名对象。   比如     index存放id     value存放数量或其他属性 3. 返璞归真使用最原始的代码代替简洁漂亮的代码。 4. 合理的使用多线程业务复杂的尽可能的并发执行(或者异步)。 5. 运用设计模式使代码简洁、易于扩展。
http://www.zqtcl.cn/news/160854/

相关文章:

  • 网站编辑专题怎么做徐州建筑工程招投标网站
  • 英文网站建设合同招考网站开发
  • 网上商城网站 找什么做dede本地环境搭建网站
  • 网站开发遇到的问题及解决方法深圳市做网站有哪些公司
  • 自媒体网站 程序18款免费软件app下载推荐
  • 产业园门户网站建设方案瑞昌网络推广
  • 长春市网站建设动漫wordpress主题下载地址
  • 如何做专业的模板下载网站wordpress 多网址
  • 做qq头像的网站wordpress 安装 服务器 系统
  • 怎样查网站的注册地点百度小说排行榜2021
  • 网站建设中中文模板wordpress siren
  • 设计本官方网站电脑版附近室内装修公司电话
  • 服务外包网站wordpress 禁止转载
  • l礼品文化网站建设不常见的网络营销方式
  • 做网站侵权腾讯企点打不开
  • iis 网站拒绝显示此网页上海网站建设类岗位
  • 营销型网站建设推荐google关键词
  • 网站上线是前端还是后端来做如何做垂直门户网站
  • 网站建设与管理2018海尔集团网站 建设目的
  • ps做网站大小wordpress调用 php文件
  • php网站忘记后台密码江苏网页制作报价
  • 网站模板 哪个好完备的常州网站推广
  • 衡水淘宝的网站建设濮阳市城乡一体化示范区主任
  • 公司网上注册在哪个网站商洛市商南县城乡建设局网站
  • 怎么才能让网站图文展示大连网站建设设计
  • 俱乐部网站 模板seo产品是什么意思
  • 新手学做网站的教学书建造师查询官网
  • win2012 iis添加网站群辉做网站服务器
  • 网站优化课程培训山东网站备案公司
  • top wang域名做网站好事业单位门户网站建设评价