java 共享锁 独占锁_图解 --乐观锁 悲观锁 可重入锁 独占锁 共享锁 公平锁 非公平锁(示例代码)...

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

一般范式为:

private Node enq(finalNode node) {for(;;) {

Node t=tail;if (t == null) { //Must initialize

if (compareAndSetHead(newNode()))

tail=head;

}else{

node.prev=t;if(compareAndSetTail(t, node)) {

t.next=node;returnt;

}

}

}

}

for(;;){

更新期望共享资源;if(期望共享资源==现实共享资源){

update();return}

}

20181128101108299604.png

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

2):自旋导致cpu压力

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

20181128101108706846.png

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

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

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

20181128101109025217.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值