我有一个大小为 N 的数组。我想在 2 个(或更多)线程中打乱它的元素。每个线程都应该使用它自己的数组部分。
比方说,第一个线程将元素从 0 打乱到 K,第二个线程将元素从 K 打乱到 N(其中 0 < K < N)。所以,它看起来像这样:
//try-catch stuff is ommited
static void shuffle(int[] array) {
Thread t1 = new ShufflingThread(array, 0, array.length / 2);
Thread t2 = new ShufflingThread(array, array.length / 2, array.length);
t1.start();
t2.start();
t1.join();
t2.join();
}
public static void main(String[] args) {
int array = generateBigSortedArray();
shuffle(array);
}
JVM 是否可以保证在这样的改组之后我会看到 main
方法中的 array
发生变化?
我应该如何实现 ShufflingThread
(或者,我应该如何运行它,也许在 synchronized
block 或其他任何东西中)以获得这样的保证?
最佳答案
join()
调用足以确保内存一致性:当 t1.join()
返回时,主线程“看到”线程 t1 的任何操作
在数组上做了。
此外,Java 保证数组不会出现分词:不同的线程可以使用同一数组的不同元素而无需同步。
关于java - 在多个线程中洗牌数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4735947/