我正在使用锁数组来保护对数据库同一条目的并发访问。数组的每个条目代表数据库的一个条目,但是数据库可能会随着程序的执行而增长,因此我计划使用 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/