图解 --乐观锁 悲观锁 可重入锁 独占锁 共享锁 公平锁 非公平锁

1.乐观锁--乐观锁是一种思想,它只解决对共享资源更新时的一致性问题,不解决读取共享资源过程当中,其余线程修改了共享资源致使读取的是旧的资源的问题node

通常范式为:函数

private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
            if (t == null) { // Must initialize
                if (compareAndSetHead(new Node()))
                    tail = head;
            } else {
                node.prev = t;
                if (compareAndSetTail(t, node)) {
                    t.next = node;
                    return t;
                }
            }
        }
    }

 

for(;;){
    更新指望共享资源;
    if(指望共享资源==现实共享资源){
    update();
    return
    }
}    

 

这种实现存在以下问题1):ABA问题----假如是链表结构,1线程操做期间,其余线程修改了A.next,1线程比较后天然觉得是预期值,判断true,继续操做(解决办法加入版本号标识,比较的不单单是A的值还有A的版本号)spa

          2):自旋致使cpu压力 线程

2.悲观锁--老是假设最坏的状况,每次去拿数据的时候都认为别人会修改,因此每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。应用场景能够抽象成以下图code

可重入锁:获取到外函数的锁时,内部函数的锁也获取到了blog

独占锁--每次只有一个线程能拿到锁(好比synchronize 和reentrantLock)如上图队列

 

共享锁--多个线程拿到锁(ReentrantReadWriteLock )以下图,3个读线程都获取锁,可是不容许读写线程和写写线程同时都持有锁,理由很简单。资源

公平锁--后续等待线程是一个FIFO队列,先排队的先获取锁it

非公平锁--线程不排队(默认,效率高)class

相关文章
相关标签/搜索