锁定老帖子 主题:java.util包(一)
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-27
同步不是哪一句话
而是看效果 看看头一个用了it 在删除元素之后就不能同步了 而后一个删除元素之后就出现了不同步的问题 |
|
返回顶楼 | |
发表时间:2006-09-27
帖子不错,不过问题也有。首先疑惑楼主看得ArrayList的实现代码是哪个公司的?对于一般大众使用的
SUN的JDK或者JRE来说。是有蛮多不同的。或者,楼主用的版本是否是JDK1.6? 我就简单列一下文中的一些问题吧。 1.ArrayList并没有对writeObject和readObject进行同步,因为这两个方法在ArrayList中是私有方法,这两个方法是不会给ArrayList本身调用的,所以也不需要去同步。 2.ArrayList每次扩容,并不是每次都扩大到原来大小的1.5倍。对于新增加的元素,ArrayList首先会尝试扩大1.5倍(记忆中JDK1.3和JDK1.4都是尝试扩大2倍),如果依然小于新增加的容积,方法会直接将容积扩大至原有容积+新增容积。 3.iterator()中的同步 , 楼主也许只是想说明modcount的计数器的检查(而且这个modcount也没有楼主想像得那么强大,它只是相当于一个计数器罢了),但是同步这个词,容易让人跟synchronized相混淆,ArrayList中对于iterator是没有同步保护的。 楼主能花精力去看JDK的源代码,并还很细致,的确不错。不过在写文章时,有些表达就要再雕琢些。否则许多朋友粗略一看,会很容易误解的。 |
|
返回顶楼 | |
发表时间:2006-09-27
抛出异常的爱 写道 同步不是哪一句话 而是看效果 看看头一个用了it 在删除元素之后就不能同步了 而后一个删除元素之后就出现了不同步的问题 我说的同步指得是语言层次的 你这里说的只是针对iterator模式一种不正确的使用而已,这样操作会抛出异常,还谈什么同步呀, 就好象你用静态方法去操作实例变量一样,本身就是错的。 arraylist的iterator()方法 生成的是一个迭代器类(内部类) 用它进行迭代操作的时候,删除元素的操作就不能使用arraylist本身的方法了。 具体原因我们可以看这篇文章: http://gceclub.sun.com.cn/yuanchuang/week-14/iterator.html |
|
返回顶楼 | |
发表时间:2006-09-27
凤舞凰扬 写道 帖子不错,不过问题也有。首先疑惑楼主看得ArrayList的实现代码是哪个公司的?对于一般大众使用的
SUN的JDK或者JRE来说。是有蛮多不同的。或者,楼主用的版本是否是JDK1.6? 我就简单列一下文中的一些问题吧。 1.ArrayList并没有对writeObject和readObject进行同步,因为这两个方法在ArrayList中是私有方法,这两个方法是不会给ArrayList本身调用的,所以也不需要去同步。 2.ArrayList每次扩容,并不是每次都扩大到原来大小的1.5倍。对于新增加的元素,ArrayList首先会尝试扩大1.5倍(记忆中JDK1.3和JDK1.4都是尝试扩大2倍),如果依然小于新增加的容积,方法会直接将容积扩大至原有容积+新增容积。 3.iterator()中的同步 , 楼主也许只是想说明modcount的计数器的检查(而且这个modcount也没有楼主想像得那么强大,它只是相当于一个计数器罢了),但是同步这个词,容易让人跟synchronized相混淆,ArrayList中对于iterator是没有同步保护的。 楼主能花精力去看JDK的源代码,并还很细致,的确不错。不过在写文章时,有些表达就要再雕琢些。否则许多朋友粗略一看,会很容易误解的。 sigh...主贴还是一个转抄,原文在: http://blog.csdn.net/robertb9527/archive/2004/10/09/129989.aspx --- 找了一圈,全是抄袭的,这种风气真让人郁闷.想和原作者讨论还找不到 |
|
返回顶楼 | |
发表时间:2006-09-28
When iterating on a multi-thread shared list, make a clone of it and then loop on the copy.
BTW, Is this blogger one of One Piece fans? |
|
返回顶楼 | |
发表时间:2006-09-28
goncha 写道 When iterating on a multi-thread shared list, make a clone of it and then loop on the copy.
BTW, Is this blogger one of One Piece fans? how about the One Piece? i like One Piece ,but i think the One Piece didn't appear when this article was written |
|
返回顶楼 | |
发表时间:2006-09-28
引用 要确保遍历过程顺利完成,必须保证遍历过程中不更改集合的内容(Iterator的remove()方法除外),因此,确保遍历可靠的原则是只在一个线程中使用这个集合,或者在多线程中对遍历代码进行同步。
(Iterator的remove()方法除外), 有一阵子想找这个功能但是没找到只好toArray()后完成了这种功能。。。看来看API不细啊 或者在多线程中对遍历代码进行同步 原来是这么番译的。。。。。汗。。。。 |
|
返回顶楼 | |