什么是悲观锁?

  1. MySQL InnoDB存储引擎,自带行锁,多线程也只能一个拿到行锁。
  2. 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?

通过版本号解决