Java 并发 - 写入同一数组的不同索引

2022-09-01 07:36:34

假设我有一个数据数组,2个线程可以安全地同时写入同一数组的不同索引吗?我担心写入速度,并且我想将“获取索引写入”位与实际写入同步。

我正在编写代码,让我假设2个线程不会获得相同的索引。


答案 1

对于数组中的两个不同索引,应用的规则与适用于两个单独变量的规则相同。

Java 语言规范中的“线程和锁”一章首先指出:

17.4.1 共享变量

[...]

所有实例字段、静态字段和数组元素都存储在堆内存中。在本章中,我们使用术语变量来指代字段和数组元素

这意味着您可以安全地同时写入两个不同的索引。但是,如果要确保使用者线程看到生产者线程写入的最后一个值,则需要同步对同一索引的写入/读取。


答案 2

在两个不同的线程中修改两个不同的变量是安全的。修改数组中的两个不同元素可以与修改不同内存地址下的两个不同变量进行比较,至少就操作系统而言。所以,是的,它是安全的。


推荐