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