Vector 的 get 方法为什么也要同步呢?

2021-02-03 08:38:13 +08:00
 brucefu

不修改数据也要同步方法吗?不同步有问题?可见性问题? public synchronized E get(int index) { if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index);

    return elementData(index);
}
2170 次点击
所在节点    Java
10 条回复
yRebelHero
2021-02-03 09:14:25 +08:00
如果其他线程在该线程获取链表之后变更了链表呢?
yRebelHero
2021-02-03 09:16:01 +08:00
对不起,是数组,脑抽了一下。
palmers
2021-02-03 09:17:25 +08:00
是 可见性问题 因为内部数组没有使用 volatile 修饰, 多线程下公用实例就会有获取到错误的数据的可能性
nicocho
2021-02-03 09:18:44 +08:00
@yRebelHero 是这样的,但是 vector 不是基于数组的么。
nicocho
2021-02-03 09:20:44 +08:00
@yRebelHero 最近在复习数据结构,对这些有点执拗 , 哈哈
340244120w
2021-02-03 09:28:57 +08:00
并发编程实践 3.1.3

锁不仅仅是关于同步与互斥的,也是关于内存可见的。为了保证所有线程都能 够看到共享的、可变变量的最新值,读取和写入线程必须使用公共的锁进行同步。
kzaemrio
2021-02-03 11:18:36 +08:00
因为你无法确定是否会出现多线程修改了数据,多线程访问可能获取不同的结果

如果能确定线程安全,就该用 ArrayList 而不是 Vector
yRebelHero
2021-02-03 11:25:51 +08:00
@nicocho 我下面马上更正了一下,刚开始的时候脑抽打错了。
brucefu
2021-02-03 13:08:36 +08:00
@kzaemrio 你在巴巴什么,八股文背多了吧
spinecho
2021-02-03 13:25:03 +08:00
Vector 这玩意只有在面试中才用吧。你们写代码用 Vector 吗?好奇

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/750783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX