什么是悲观锁?
- MySQL InnoDB存储引擎,自带行锁,多线程也只能一个拿到行锁。
- luck锁或者sy锁,多线程也只能一个,没拿到的只能等待。
什么是乐观锁?
当前线程不会阻塞,乐观锁。当前线程如果没有拿到锁,就会自旋,就是死循环。
mysql如何实现乐观锁?
在我们的表结构中,添加一个字段,版本字段version,多个字段,对同一行数据进行操作,提前查询最新的版本号码,最为update条件查询,如果version变化,就修改失败,否则就不断重试。
cas实现无锁机制
原理:
定一个变量。
获取=0,
未获取=1。
java有哪些锁的分类?
- 悲观(没有获取,阻塞)与乐观锁(不会阻塞,自旋),底层是aqs
- 公平锁【没有获取,会根据请求顺序进行排序】,非公平锁【抢占锁】。
- 自旋锁/重入锁
- 重量级锁与轻量级锁
- 独占锁/共享锁
锁的可重入性
记录哪个线程拿到了锁。
什么是cas
cas底层不是java写的,是c。
没有获取到锁的线程是不会阻塞的,通过循环控制不断的获取锁。
cas 有三个参数
内存值v
预期值e
修改值n
利用cas手写一把锁
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);
}
}
cas如何避免aba?
通过版本号解决