这次看了源码,发现ReentrantLock的底层实现是AQS,而AQS底层实现是Volatile+CAS+CLH队列,因此想看看ReentrantLock与CAS的性能比较,因此做了这么一组实验。
// 使用ReentrantLock
class LockRunnable implements Runnable {
static int i = 0;
private ReentrantLock lock;
private int loopNumber;
public LockRunnable(ReentrantLock lock, int loopNumber) {
this.lock = lock;
this.loopNumber = loopNumber;
}
@Override
public void run() {
// 将加锁解锁卸载for放在内部,从而让锁的竞争变得激烈
for (int j = 0; j < loopNumber; j++) {
try {
lock.lock();
this.i++;
}
finally {
lock.unlock();
}
}
}
}
// 使用AtomicInteger,其底层实现是CAS
class CASRunnable implements Runnable {
private AtomicInteger ai;
private int loopNumber;
public CASRunnable(AtomicInteger ai, int loopNumber) {
this.ai = ai;
this.loopNumber = loopNumber;
}
@Override
public void run() {
// 将incrementAndGet放在for循环内部,从而让CAS激烈,同时与Lock的数量保持一致
for (int j = 0; j < loopNumber; j++) {
ai.incrementAndGet();
}
}
}
public