我正在使用一组锁来保护对数据库相同条目的并发访问。数组的每个条目代表数据库的一个条目,但是数据库可能随着程序的执行而增长,因此我打算使用java.utils.Arrays.copyOf
动态地使其增长,例如:
lockArray = Arrays.copyOf(lockArray, lockArray.length + 1);
我的问题是,这是否可能导致并发执行问题?例如,如果在复制完成时线程正在尝试从lockArray读取。我能想到的一个问题是,如果copyOf操作不是原子的(我不知道),那么在复制数组的同时可能会对其进行更改,从而产生不一致。
如果是这样,是否有避免该问题的方法?
(值得注意的是,阵列将始终增长,而不会减少,并且无论阵列增长了多少次,lockArray中数据库条目的索引将始终相同)。
最佳答案
假设您以线程安全的方式发布新数组(例如,使用易失性引用),并且正确保护了数组扩展,以使多个线程无法尝试同时扩展数组(例如,使用同步块),那么应该没有问题。 (请注意,在初始化所有新的锁实例之前,您不能使新的lockArray对其他线程可用)。