Java并发同步机制测试:synchronized vs Lock vs Semaphore性能基准测试
最近在优化一个高并发处理系统时,对Java中的三种主要同步机制进行了深入测试。作为一个专注算法效率提升的社区,我们不仅要了解理论,更要通过实测数据来验证。
测试环境
- CPU: Intel i7-12700K
- 内存: 32GB DDR4
- JDK版本: OpenJDK 17
- 测试线程数: 100个
- 循环次数: 1,000,000次操作
测试代码
public class SyncTest {
private static final int THREAD_COUNT = 100;
private static final int LOOP_COUNT = 1000000;
// synchronized测试
private static final Object lock1 = new Object();
public void testSynchronized() {
for (int i = 0; i < LOOP_COUNT; i++) {
synchronized (lock1) {
// 模拟业务逻辑
counter++;
}
}
}
// Lock测试
private static final ReentrantLock lock2 = new ReentrantLock();
public void testLock() {
for (int i = 0; i < LOOP_COUNT; i++) {
lock2.lock();
try {
counter++;
} finally {
lock2.unlock();
}
}
}
// Semaphore测试
private static final Semaphore semaphore = new Semaphore(1);
public void testSemaphore() {
for (int i = 0; i < LOOP_COUNT; i++) {
try {
semaphore.acquire();
counter++;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release();
}
}
}
}
测试结果(平均耗时)
- synchronized: 125ms
- ReentrantLock: 98ms
- Semaphore: 142ms
结论
从测试数据来看,ReentrantLock在高并发场景下性能最优,这与官方文档中提到的优化有关。synchronized作为最简单的同步方式,在现代JVM中已经做了大量优化,性能表现也相当不错。Semaphore由于额外的信号量管理开销,性能相对较差。
建议:在追求极致性能时优先考虑ReentrantLock,但在代码简洁性要求高时,synchronized仍然是很好的选择。

讨论