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

时间:2014-06-11 12:40:56

标签: java arrays multithreading arraycopy

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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