我在开发一个高并发应用程序。在应用程序代码中,我尽量避免同步。最近,在比较非同步和同步代码版本的测试性能时,结果表明同步代码的执行速度比非同步版本快三四倍。
经过一些实验我得出了这段测试代码:
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 1391Number 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/