为什么会诞生非互斥同步锁? 因为互斥同步锁的劣势
    (1)阻塞和唤醒带来的性能劣势
    (2)永久阻塞:如果持有锁的线程被永久阻塞,比如遇到了无限循环,死锁等活跃性问题,那么等待该线程释放锁的其他线程,将永远得不到执行
    (3)优先级反转:如果优先级低的线程释放时间慢,即使设置了优先级高的线程,也得等到优先级低的线程释放锁才能获取,因此优先级反转了

    乐观锁被称为非互斥同步锁,悲观锁被称为互斥同步锁
    悲观锁

    1. 如果我锁不住这个资源,别人就来争抢,就会造成数据结果错误,所以每次悲观锁为了确保结果的正确性,会在每次获取并修改数据时把数据锁住,让别人无法访问该数据,这样就可以确保数据内容万无一失。
    2. Java中悲观锁的实现就是synchronized和Lock相关类

    乐观锁

    1. 认为自己处理操作的时候不会被其他线程来干扰,所以并不会锁住被操作的对象
    2. 在更新的时候,去对比在我修改的期间数据有没有被其他人改变过:如果没被改变过,就说明真的是只有我自己在操作,那我就正常去修改数据。
    3. 如果数据和我一开始拿不到的数据不一样了,说明其他人在这段时间内修改过数据,那我就不能继续刚才的更新数据过程了,我会选择放弃,报错,重试等策略
    4. 乐观锁的实现一般都是利用CAS算法来实现的