image.png
    无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。
    哪些锁这个问题不用死记硬背,想想并发编程的那些关键字,cas,reentrantlock,synchronized你就想起来他们的特征了

    根据是否锁住同步资源可以分为乐观锁悲观锁
    乐观锁指的是每次都乐观的以为共享资源不会被其他线程所修改,最常使用的就是CAS算法,Java里面的原子类就是通过CAS来实现的,悲观锁指的是每次都悲观的以为共享资源会被其他线程所修改,比如说Java的synchronized和lock锁(乐观锁适合读多邪少,悲观锁适合写多读少)
    公平锁指的是多个线程按照申请顺序来获取锁,而非公平锁可以插队获取锁,Reentrantlock里面的两个子类FairSync和NofairSync就分别实现了公平锁和非公平锁,区别在于tryaquire的hasQueuedPredecessors()方法会判断一下当前的CHL队列是否有元素,如果有元素的话是不是自己,如果有其他元素就没有获取锁的资格,就会返回false排队去
    可重入锁的意思指的就是在已经获取锁的情况下再次获取锁,也就是递归的获取锁,ReentrantLock和Synchronized,一个通过AQS的state变量来实现,一个通过Moniter对象内部的count计数器来实现
    共享锁和排他锁,也是通过AQS的state变量来实现,读写锁把state切分成两个16位,一个用来表示读状态一个表示写状态
    根据是否阻塞可以分为阻塞锁和非阻塞锁
    根据锁是否需要排队分为公平锁和非公平锁
    根据一个线程能否多次获取同一把锁分为可重入锁和不可重入锁
    根据是否共享分为共享锁和排他锁