不修改数据也要同步方法吗?不同步有问题?可见性问题? public synchronized E get(int index) { if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index);
return elementData(index); } 
不修改数据也要同步方法吗?不同步有问题?可见性问题? public synchronized E get(int index) { if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index);
return elementData(index); } 1 yRebelHero Feb 3, 2021 如果其他线程在该线程获取链表之后变更了链表呢? |
2 yRebelHero Feb 3, 2021 对不起,是数组,脑抽了一下。 |
3 palmers Feb 3, 2021 是 可见性问题 因为内部数组没有使用 volatile 修饰, 多线程下公用实例就会有获取到错误的数据的可能性 |
4 nicocho Feb 3, 2021 @yRebelHero 是这样的,但是 vector 不是基于数组的么。 |
5 nicocho Feb 3, 2021 @yRebelHero 最近在复习数据结构,对这些有点执拗 , 哈哈 |
6 340244120w Feb 3, 2021 并发编程实践 3.1.3 锁不仅仅是关于同步与互斥的,也是关于内存可见的。为了保证所有线程都能 够看到共享的、可变变量的最新值,读取和写入线程必须使用公共的锁进行同步。 |
7 kzaemrio Feb 3, 2021 因为你无法确定是否会出现多线程修改了数据,多线程访问可能获取不同的结果 如果能确定线程安全,就该用 ArrayList 而不是 Vector |
8 yRebelHero Feb 3, 2021 @nicocho 我下面马上更正了一下,刚开始的时候脑抽打错了。 |
10 spinecho Feb 3, 2021 Vector 这玩意只有在面试中才用吧。你们写代码用 Vector 吗?好奇 |