CAS,compare and swap的缩写,中文翻译成比较并替换。它是乐观锁的一种体现,CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。类似于这种操作:update table set q = 2 where q = 1
代码实现
// 使用volatile修饰visitsNum的值,保证线程操作时内存的可见性
private volatile long visitsNum;
// 结合synchronized定义CAS方法,把锁的颗粒度变小,已提升性能
private boolean cas(long A, long B) {
// 如果当前visitsNum的值与预期的A值一样,就把当前的visitsNum值替换为B值
synchronized (this) {
if (visitsNum == A) {
visitsNum = B;
return true;
} else {
return false;
}
}
}
// 自增方法
public long autoincrement() {
long oldValue;
long newValue;
do {
oldValue = visitsNum;
newValue = oldValue + 1;
} while (!cas(oldValue, newValue));
return newValue;
}
测试结果
public static void main(String[] args) {
HtmlCounterCAS htmlCounterCAS = new HtmlCounterCAS();
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(htmlCounterCAS.autoincrement());
}
}).start();
}
}
如图所示
本文只是个小demo,实际中要真正实现网页访问,要考虑的因素还是有很多,如限制IP在一定的时间内访问数次,怎么防止代理IP刷访问量.....
欢迎留言沟通



