使用锁的Java并发

时间:2018-11-13 17:34:05

标签: java multithreading

我正在处理一个图,它可以按顺序工作,现在我想通过并发处理来提高其性能。

这就是我在做什么:

  • 我在每次迭代中遍历图形中的所有边。

  • 每次迭代都会生成一个输出数组,该输出数组将馈入下一个 迭代。

  • 要同时处理图形,我将基于 关于线程数,我正在使用,并且在每次迭代后使用障碍对线程进行同步。

这是我的代码,为简洁起见,我省略了一些变量声明,方法等


class Worker implements Runnable {
    ReentrantLock lock = new ReentrantLock();
    void run() {
        while (true) {
            barrier.await();
            lock.lock();

            iterate(input_array, output_array);

            lock.unlock();
            barrier.await();
        }
    }
}

class ProcessGraph {

    void iterate(input_array, output_array) {

        for (int i = 0; i < num_of_edges; i++) {
            int processed_number = process_edge(i);
            output_array[destinations[i]] += processed_number;
        }

    }

}

声明数组保留顶点,并且小于num_of_edges,因此在写入output_array时会有一些重叠。

我在每个线程的迭代方法周围放置了一个锁,以确保对output_array的写入是原子的。

问题 由于每次迭代都只是添加到先前的迭代中,因此即使它不是原子执行的,代码也总是会产生正确的答案。

我认为添加锁将确保output_array[destinations[i]] += processed_number;被原子执行。

因此,如果两个线程试图同时写入output_array,则一个线程将被迫等待。

我不认为这是因为当使用锁和不使用锁执行时,我的代码以相同的速度运行,并且我不知道如何检查代码是否以原子方式执行。

0 个答案:

没有答案