多线程中使用Java集合类.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
缓冲器(Buffer)的细节 广州java培训整理  Java集合类中,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。   因此,当一个线程试图ArrayList的数据的时候,另一个线程对ArrayList在进行迭代的,会出错,抛出ConcurrentModificationException。   比如下面的代码:   1.final ListString tickets = new ArrayListString();   2.for (int i = 0; i 100000; i++) {   3.?? tickets.add(ticket NO, + i);   4.}   5.System.out.println(start1...);   6.for (int i = 0; i 10; i++) {   7.?? Thread salethread = new Thread() {   8.?????? public void run() {   9.?????????? while (tickets.size() 0) {   10.?????????????? tickets.remove(0);   11.?????????????? System.out.println(Thread.currentThread().getId()+Remove 0);   12.?????????? }   13.?????? }   14.?? };   15.?? salethread.start();   16.}   17.System.out.println(start2...);   18.new Thread() {   19.?? public void run() {   20.?????? for (String s : tickets) {   21.System.out.println(s);   22.?????? }   23.?? }   24.}.start();   上述程序运行后,会在某处抛出异常:   java.util.ConcurrentModificationException   at java.util.ArrayList$Itr.checkForComodification(Unknown Source)   at java.util.ArrayList$Itr.next(Unknown Source)   at mytest.mytestpkg.Tj$2.run(Tj.java:138)   Vector是线程同步的,那么把ArrayList改成Vector是不是就对了呢?   答案是否定的,事实上,无论是ArrayList还是Vector,只要是实现Collection接口的,都要遵循fail-fast的检测机制,即在迭代是时候,不能修改集合的元素。一旦发现违法这个规定就会抛出异常。   事实上,Vector相对于ArrayList的线程同步,体现在对集合元素是否脏读上。即ArrayList允许脏读,而Vector特殊的机制,不会出现脏读,但是效率会很差。   举个例子,一个集合,有10个线程从该集合中删除元素,那么每个元素只可能由一个线程删除掉,不可能会出现一个元素被多个线程删除的情况。   比如下面的代码:   1.final ListString tickets = new ArrayListString();   2.for (int i = 0; i 100000; i++) {   3.?? tickets.add(ticket NO, + i);   4.}   5.System.out.println(start1...);   6.for (int i = 0; i 10; i++) {   7.?? Thread salethread = new Thread() {   8.?????? public void run() {   9.?????????? while (true) {   10.if(tickets.size()0)   11.System.out.println(Thread.currentThread().getId()+ tickets.remove(0));   12.else   13.brea

文档评论(0)

ktj823 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档