java - 重新分配多个线程使用的对象

标签 java multithreading arrays

我正在使用锁数组来保护对数据库同一条目的并发访问。数组的每个条目代表数据库的一个条目,但是数据库可能会随着程序的执行而增长,因此我计划使用 java.utils.Arrays.copyOf 来动态地使其增长,如下所示:

lockArray = Arrays.copyOf(lockArray, lockArray.length + 1);

我的问题是这是否会导致并发执行出现问题;例如,如果一个线程在复制完成时尝试从 lockArray 中读取。我能想到的一个问题是,如果 copyOf 操作不是原子操作(我不知道),那么数组可能在复制的同时发生更改,从而产生不一致。

如果是这样,有没有办法避免这个问题?

(值得注意的是,数组将始终增长,永远不会减少,并且无论数组增长了多少次,lockArray 中数据库条目的索引将始终相同)。

最佳答案

假设您以线程安全的方式发布新数组(例如使用 volatile 引用)并且正确保护数组扩展,以便多个线程无法同时尝试扩展数组(例如使用同步块(synchronized block)),那么应该不会有问题。 (请注意,在初始化所有新锁实例之前,您无法使新的 lockArray 对其他线程可用)。

关于java - 重新分配多个线程使用的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24163218/

相关文章:

java - 如何在一定时间内定期运行作业

java - java 中显式调用父构造函数时的 super() 行为

arrays - angularjs如何将值推送到数组的特定位置

javascript - 为什么谷歌闭包编译器会警告数组的长度?

c# - 基本线程问题

javascript - Set.has() 方法 O(1) 和 Array.indexOf O(n) 是吗?

java - 与选择( float )混淆

java - 下面的片段是什么意思?

java - 请有人帮助将 opencv 代码转换为 javacv?

java - 使用 Vert.x for Java 的任何好的 Redis 客户端 API?