锁详解

共享锁(读锁)

可以查看不可以增加修改和删除,如果已有事务对其添加了共享锁,其他事务只能增加共享锁不能增加排它锁。

排他锁(写锁,独占锁,互斥锁)

如果有线程已经对对象已经添加了排他锁,其他线程只能排到等待释放锁。保证了再释放锁之前不能再读取和修改,同一时刻只能有一个线程访问该对象。是一种悲观锁。

悲观锁

总是悲观的认为数据已被修改,没此拿数据的时候都会上锁,别人想拿都会阻塞直到它释放锁。关系型数据库用到了该锁。

如:行锁,表锁,读锁,写锁,synchronized的实现都是悲观锁

乐观锁

没此拿数据都乐观的认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下别人有没有跟新数据。

适应于读多写少,提高吞吐量。Java的CAS使用乐观锁实现。(冲突检查和数据更新)

CAS介绍

乐观锁的一种实现,当多个线程更新某个变量时,只要一个线程能跟新其中的值,其他线程都失败,失败后并不会被挂起,

而是告知本次本次竞争中失败,可以再次尝试。

CAS操作中包含三个操作数,需要读的内存位置(内存现值),需要比较的预期值,和需要写入新值。

如果内存值和预期值一致则跟新为新值,否则不做任何操作

CAS缺点:存在ABA问题。

 

posted @ 2020-08-25 11:57  91程序猿  阅读(56)  评论(0)    收藏  举报