
当前线程不会阻塞,乐观锁。当前线程如果没有拿到锁,就会自旋,就是死循环。
在我们的表结构中,添加一个字段,版本字段version,多个字段,对同一行数据进行操作,提前查询最新的版本号码,最为update条件查询,如果version变化,就修改失败,否则就不断重试。
原理: 定一个变量。 获取=0, 未获取=1。
记录哪个线程拿到了锁。
cas底层不是java写的,是c。 没有获取到锁的线程是不会阻塞的,通过循环控制不断的获取锁。
内存值v 预期值e 修改值n
public class AtomicTryLOCK {
private AtomicLong cas = new AtomicLong(0);
/**
* 记录当前锁被哪个线程占用
*/
private Thread lockThread;
/**
* 获取锁
* 0没有使用
* 1已经被线程占用
* @return
* cas 0-1变成功 true拿到成功 否则拿到失败
*/
public boolean AtomicTryLOCK(
){
while (true) {
boolean b = cas.compareAndSet(0, 1);
if (b) {
lockThread=Thread.currentThread();
break;
}
}
return true;
}
/**
* 释放锁
* @return
*/
public boolean unlock(){
if (lockThread != Thread.currentThread()) {
return false;
}
return cas.compareAndSet(1,0);
}
}通过版本号解决