java - 在多个线程中洗牌数组

标签 java multithreading concurrency jvm

我有一个大小为 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/

相关文章:

java - 如何将数据数组附加到未知大小的数组

java - 对信号量类有点困惑

c - 线程结构作为函数参数 C

java - Spring在非常简单的程序中忽略@Qualifier

java - 无法使用firebase云消息传递在mysql数据库中注册 token

java - 在 h2 中重置自动增量

multithreading - Rust中的多线程备忘录

go - 选择和上下文。上下文完成 channel

java - 带有线程池的嵌套循环

java - 使用 for(boolean haveNext = false;;) 而不是 while(cond)