一些背景:我创建了一个人为的例子来向我的团队展示VisualVM的使用.特别是,一个方法有一个不必要的synchronized
关键字,我们看到线程池中的线程阻塞,他们不需要.但删除该关键字具有下面描述的令人惊讶的效果,下面的代码是最简单的情况我可以减少原始示例以重现问题,并且使用a ReentrantLock
也会产生相同的效果.
请考虑以下代码(https://gist.github.com/revbingo/4c035aa29d3c7b50ed8b上的完整可运行代码示例- 您需要将Commons Math 3.4.1添加到类路径中).它创建100个任务,并将它们提交给5个线程的线程池.在任务中,创建两个500x500随机值矩阵,然后相乘.
public class Main {
private static ExecutorService exec = Executors.newFixedThreadPool(5);
private final static int MATRIX_SIZE = 500;
private static UncorrelatedRandomVectorGenerator generator =
new UncorrelatedRandomVectorGenerator(MATRIX_SIZE, new StableRandomGenerator(new JDKRandomGenerator(), 0.1d, 1.0d));
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws Exception {
for(int i=0; i < 100; i++) {
exec.execute(new Runnable() {
@Override
public void run() {
double[][] matrixArrayA = new double[MATRIX_SIZE][MATRIX_SIZE];
double[][] matrixArrayB = new …
Run Code Online (Sandbox Code Playgroud)