java - Vector 与 ArrayList 同步的示例

标签 java data-structures vector arraylist synchronization

vector 包含同步方法,而 ArrayList 不包含。当超过 1 个线程访问和修改数据时,这些同步方法有助于防止数据损坏。

有人可以为我更详细地解释一下吗? Vector 包含同步方法是什么意思?这些方法是否包含控制多线程访问数据的锁定和解锁的内部锁?有人可以提供一些示例,说明使用 vector (相对于 ArrayList)可以防止数据损坏,并进一步阐明该问题或数据结构和同步问题吗?

感谢您的时间和帮助。

最佳答案

What does it mean that Vectors contain synchronized methods?

这些方法已被标记为已同步

Do the methods contain internal locks that control the locking and unlocking of the data for multiple thread access?

不,尽管关键字位于方法上,但被锁定的是对象,而不是方法。没有办法锁定这样的方法。

Can someone provide some examples of where using a vector (vs. ArrayList) could prevent data corruption and shed some more light on the issue or Data Structures and synchronization issues?

有很多例子。最简单的是增加一个数字。假设您有两个线程递增一个数字(例如集合的大小),无需同步即可。

Thread1: read size e.g. 0
Thread1: increment size
Thread1: write size e.g. 1
Thread2: read size e.g. 1
Thread2: increment size
Thread2: write size e.g. 2

但是,由于线程可以按任何顺序执行操作(因为这是线程的全部要点),因此您也可以拥有

Thread1: read size e.g. 0
Thread2: read size e.g. 0
Thread1: increment size
Thread2: increment size
Thread1: write size e.g. 1
Thread2: write size e.g. 1

因此,即使两个线程递增了计数器,它也是不正确的,因为它们的操作不协调。这就是同步为您所做的事情。

关于java - Vector 与 ArrayList 同步的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629449/

相关文章:

Java:通过关联覆盖行为

c++ - 箭头运算符和 vector

java - 如何比较存储在数组列表中的两个原始整数类型?

java - 如何找到存储在由每个值的深度加权的整数二叉树中的值的总和?

c - 如何使用 switch case 更新值

c++ - 为什么不创建 vector vector 中的对象

c++ - vector 数据正在重置?

java - 如何在 Android 上用 C 加载我自己的 Java 类?

java - 构造函数应该只调用 SonarQube 工具中不可重写的方法

java - JDeveloper - 如何生成 stub 类