java - 同步的 java 代码执行速度比非同步代码快几倍

标签 java concurrency synchronization

我在开发一个高并发应用程序。在应用程序代码中,我尽量避免同步。最近,在比较非同步和同步代码版本的测试性能时,结果表明同步代码的执行速度比非同步版本快三四倍。

经过一些实验我得出了这段测试代码:

private static final Random RND = new Random();
private static final int NUM_OF_THREADS = 3;
private static final int NUM_OF_ITR = 3;
private static final int MONKEY_WORKLOAD = 50000;

static final AtomicInteger lock = new AtomicInteger();

private static void syncLockTest(boolean sync) {
    System.out.println("syncLockTest, sync=" + sync);

    final AtomicLong jobsDone = new AtomicLong();
    final AtomicBoolean stop = new AtomicBoolean();

    for (int i = 0; i < NUM_OF_THREADS; i++) {
        Runnable runner;

        if (sync) {
            runner = new Runnable() {
                @Override
                public void run() {
                    while (!stop.get()){
                        jobsDone.incrementAndGet();

                        synchronized (lock) {
                            monkeyJob();
                        }

                        Thread.yield();
                    }
                }
            };
        } else {
            runner = new Runnable() {
                @Override
                public void run() {
                    while (!stop.get()){
                        jobsDone.incrementAndGet();

                        monkeyJob();

                        Thread.yield();
                    }
                }
            };
        }

        new Thread(runner).start();
    }

    long printTime = System.currentTimeMillis();

    for (int i = 0; i < NUM_OF_ITR;) {
        long now = System.currentTimeMillis();
        if (now - printTime > 10 * 1000) {
            printTime = now;
            System.out.println("Jobs done\t" + jobsDone);
            jobsDone.set(0);
            i++;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    stop.set(true);
}

private static double[] monkeyJob() {
    double[] res = new double[MONKEY_WORKLOAD];
    for (int i = 0; i < res.length; i++) {
        res[i] = RND.nextDouble();
        res[i] = 1./(1. + res[i]);
    }
    return res;
}

我研究了线程数量、工作负载、测试迭代次数——每次同步代码的执行速度都比未同步代码快得多。

这是 NUM_OF_THREADS 的两个不同值的结果

Number of threads:3
syncLockTest, sync=true
Jobs done 5951
Jobs done 5958
Jobs done 5878
syncLockTest, sync=false
Jobs done 1399
Jobs done 1397
Jobs done 1391

Number of threads:5
syncLockTest, sync=true
Jobs done 5895
Jobs done 6464
Jobs done 5886
syncLockTest, sync=false
Jobs done 1179
Jobs done 1260
Jobs done 1226

测试环境 Windows 7 专业版 Java 版本 7.0

这是一个类似的案例 Synchronized code performs faster than unsynchronized one

有什么想法吗?

最佳答案

Random 是一个线程安全的类。您很可能通过围绕主要工作进行同步来避免对调用 Random 类的争用。

关于java - 同步的 java 代码执行速度比非同步代码快几倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857641/

相关文章:

c++ - 如何安全地将包含的对象(菜单项)与需要容器(菜单)的 API 同步?

java - 使用放心的java对不同的请求主体进行数据驱动测试的最佳方法

java - Spring Auth + JWT 登录响应 200 但缺少正文和 header

java - 使用 web.xml 配置带有 Glassfish 4 的 JX-RS 会导致错误

scala - 奇怪的行为 : Scala Actors 2. 7.7 与 2.8-快照

java - 我应该如何在 javaFx 中为类似卡拉 OK 的应用程序突出显示带有音频的文本

java - 计时器倒数为负

scala - 执行上下文和调度程序 - 最佳实践、有用的配置和文档

PHP session_start 序列化并阻止共享同一 session 的所有其他人

java - 并发问题: Synchronized methods