免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1722 | 回复: 4
打印 上一主题 下一主题

请问vector的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-19 19:49 |只看该作者 |倒序浏览
看到一段话,大家说说有没有道理:
“既然大家都讲到了同步,那么也稍微谈一下,同步了的Hashtable和Vector真的那么有用吗?真的如果用了socalled thread-safe Hashtable and Vector程序代码就不用再同步了吗?
这个例子(Vector vec; Object element
if (!vec.contains(element))
  vec.add(element);
这段代码可以不同步吗?不可以,context switch might take place right after you do the containg check.
所以,在程序中还是需要:
synchronized (vec)
{
if (!vec.contains(element))
  vec.add(element);
}
这样Synchronized Vector比起没有Synchronized ArrayList和LinkedList来说一点好处都没有了。”

论坛徽章:
0
2 [报告]
发表于 2005-10-20 03:16 |只看该作者

请问vector的一个问题

Thread-Safe的object,原子操作也只到method 级别,你如果要用多个method当然就不管用了。

论坛徽章:
0
3 [报告]
发表于 2005-10-20 09:30 |只看该作者

请问vector的一个问题

你指的多个方法是contains和add吗?
那么如果想对一个vector进行add和remove(0)能否同步实现呢?

论坛徽章:
0
4 [报告]
发表于 2005-10-20 20:18 |只看该作者

请问vector的一个问题

对,所以你的例子代码对同步的Vector和非同步的ArrayList来说,都需要使用synchronized来保证不会有错误。但是如果是非同步的ArrayList,如果多个线程同时执行一个单一的add操作,就可能出错,但是Vector不会。

论坛徽章:
0
5 [报告]
发表于 2005-10-20 21:35 |只看该作者

请问vector的一个问题

我想LZ需要理解perryhg所说得原子性.

  1. synchronized (vec)
  2. {
  3. if (!vec.contains(element))
  4. vec.add(element);
  5. }

复制代码

以上代码是为了保证2个方法得原子性.

而Vector内部得所有的所有同步, 都只能保证1个方法的原子性
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP