Queue 队列  特性  先进先出     和栈 Stack  非常相似 不过 栈 遵循 后进先出

Queue 和Stack 都存在数据并发的 问题

  1. public static Queue<Person> queue = new Queue<Person>(); //定义一个队列 先进先出 存在并发风险
  2. public static Stack<Person> stack = new Stack<Person>(); //定义一个栈 后进先出 存在并发风险
  3. static void Main(string[] args)
  4. {
  5.  
  6. Task[] task=new Task[];
  7. for (int i = ; i < ; i++)
  8. {
  9. task[i] = new Task(RuDui);
  10. task[i].Start();
  11. }
  12. Task.WaitAll(task);
  13. Console.WriteLine(queue.Count);
  14. Console.WriteLine(stack.Count);
  15.  
  16. }
  17.  
  18. public static void RuDui()
  19. {
  20.  
  21. Parallel.For(, , (i) =>
  22. {
  23. Person person = new Person()
  24. {
  25. Name = "测试" + i,
  26. Age = ,
  27. Address = "河南郑州市" + i
  28. };
  29.  
  30. queue.Enqueue(person);
  31. stack.Push(person);
  32. });
  33.  
  34. }

执行结果如下  甚至会报错 :  目标数据的长度不够 ,请检查 destIndex 和长度 一级数组的下限

解决的办法也很简单  : lock  锁

  1. lock(o){
  2.  
  3. queue.Enqueue(person);
  4. stack.Push(person);
  5. }

另外一种解决办法, 用 ConcurrentQueue 和 ConcurrentStack

  1. private static object o = new object();
  2.  
  3. //.net 4.0 以后 微软提供了线程安全的先进先出 集合 无需考虑并发
  4.  
  5. public static ConcurrentQueue<Person> conQueue = new ConcurrentQueue<Person>();
  6. public static ConcurrentStack<Person> conStack = new ConcurrentStack<Person>();
  7.  
  8. public static Queue<Person> queue = new Queue<Person>(); //定义一个队列 先进先出 存在并发风险
  9. public static Stack<Person> stack = new Stack<Person>(); //定义一个栈 后进先出 存在并发风险
  10. static void Main(string[] args)
  11. {
  12.  
  13. Task[] task=new Task[];
  14. for (int i = ; i < ; i++)
  15. {
  16. task[i] = new Task(RuDui);
  17. task[i].Start();
  18. }
  19. Task.WaitAll(task);
  20. Console.WriteLine(queue.Count);
  21. Console.WriteLine(stack.Count);
  22.  
  23. Console.WriteLine(conQueue.Count);
  24. Console.WriteLine(conStack.Count);
  25.  
  26. }
  27.  
  28. public static void RuDui()
  29. {
  30.  
  31. Parallel.For(, , (i) =>
  32. {
  33. Person person = new Person()
  34. {
  35. Name = "测试" + i,
  36. Age = ,
  37. Address = "河南郑州市" + i
  38. };
  39.  
  40. lock(o){
  41.  
  42. queue.Enqueue(person);
  43. stack.Push(person);
  44. }
  45. conQueue.Enqueue(person);
  46. conStack.Push(person);
  47.  
  48. });
  49.  
  50. }

最终输出结果

记录Queue插入的时候报错的更多相关文章

  1. Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。

    异常问题记录: 本想自己手动实现一个日志记录功能.使用Queue队列集合来实现多线程的日志记录. 测试 一个线程写入数据Enqueue和一个线程读取数据Dequeue ,直接用的无休眠死循环. 终于抛 ...

  2. MYSQL timestamp NOT NULL插入NULL的报错问题

    1. 在开发两个数据库数据同步功能的时候,需要在本地搭建一个本地的数据库作为一个本地库,然后用于同步开发库中的数据.在插入的时候出现了一个问题. 问题描述: 我们每张表中都会存在一个create_ti ...

  3. Oracle 插入时间时 报错:ORA-01861: 文字与格式字符串不匹配 的解决办法

    一.写sql的方式插入到Oracle中 往oracle中插入时间  '2007-12-28 10:07:24'如果直接按照字符串方式,或者,直接使用to_date('2007-12-28 10:07: ...

  4. 插入mysql语句报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    插入一个很简单的sql语句时候,mysql一直报错: [SQL] INSERT INTO ORDER ( id, activity_id, order_type, phone, order_amoun ...

  5. MySql数据库插入或更新报错:Cannot add or update a child row: a foreign key constraint fails

    具体报错信息: Cannot add or update a child row: a foreign key constraint fails (`xxx`.`AAA`, CONSTRAINT `t ...

  6. Idea使用记录--添加Problems&&解决Autowired报错could not autowire

    今天在使用Idea的时候,发现Idea在整个每次找到错误代码非常不方便(Idea如果类中有错误,没有打开过类并不会提示,比如构建工程后缺少jar包问题).我想快速看到工程哪里出问题类似于eclipse ...

  7. ionic3.x版本开发问题记录---使用Image Resizer打包报错问题

    按照官方文档安装和使用,最后在打包的时候报错 /platforms/android/src/info/protonet/imageresizer/ImageResizer.java:12: error ...

  8. Nuxt.js 踩坑记录,(1)引入fs包报错

    今天又是码农的一天. 但是写着写着,不知道为啥就页面就报错了, 如图所示,我在db/app.js下引入了fs这个模块,提示我npm install,我也照做了,但是仍然报错. 通过各种百度,踩坑,最终 ...

  9. 大量数据通过Phoenix插入到hbase报错记录(2)

    错误: Caused by: java.sql.SQLException: ERROR (INT10): Unable to find cached index metadata 解决办法: 在hba ...

随机推荐

  1. Redis深入学习笔记(三)RDB及AOF流程

    RDB是Redis持久化数据的一种方式,是执行时间点的Redis内存快照,redis数据还原时加载rdb文件,Redis的主从数据同步也是基于RDB实现的. RDB流程: 1)执行bgsave命令,R ...

  2. Unity Post-Processing的一些分享

    讲些什么? 绝大多数的游戏或多或少都会使用些后处理效果. 早期版本中,Unity在提供的接口有限,优化空间不大,属于放任自流.官方推出了Post-Processing(下文简称PP)并在Github上 ...

  3. Jmeter连接数据库方式

    关系型数据库: 1.mysql: 方式:Database URL:jdbc:mysql://localhost:port/DBname?user=**&password=**&allo ...

  4. python-pytest学习

    一:pytest基于unittest之上的单元测试框架1.自动发现测试模块和测试方法:2.断言使用assert+表达式即可:3.可以设置会话级.模块级.类级.函数级的fixtures :数据准备+清理 ...

  5. js小技巧总结

    js小技巧总结 1.Array.includes条件判断 function test(fruit) { const redFruits = ["apple", "stra ...

  6. python数据类型、if判断语句

    python的数据类型: int(整型) float(浮点型) #相较c++,去除了char.long.longlong... str(字符串)    #同等c++ sting类型 list(列表) ...

  7. 7.3.5 Tomcat堆溢出分析(1)

    实战Java虚拟机:JVM故障诊断与性能优化>第7章分析Java堆,本章主要介绍了Java堆的分析方法.首先,介绍了几种常见的Java内存溢出现象及解决思路.其次,探讨了java.lang.St ...

  8. C#实现多个PDF合并及去除文字水印功能

    实现pdf合并就是使用Spire.Pdf.dll类库的方法,但是注意需要同时引用Spire.Pdf.dll和Spire.License.dll两个类库,且两个类库的版本要一致 String[] fil ...

  9. 聊一聊Java泛型的擦除

    最近看了<thinking in java>的第十五章泛型,感觉有些东西需要记录下来. 泛型是Java SE5才被引入的概念,现在我的工作中泛型主要使用在集合,这样可以知道set()和ge ...

  10. 魔力Python——一些基本概念

    1.I/O操作 I/O输入/输出(input/output)的缩写. 概念I/O系统,英文全称为“Input output system”,中文全称为“输入输出系统”,由输入输出控制系统和外围设备两部 ...