悲观锁、乐观锁 乐观锁的一种实现方式-CAS

悲观锁和乐观锁都是一种思想;

悲观锁:独占锁、阻塞锁,在对数据进行操作实时默认会发生冲突,会对数据操作加上锁,当一个线程获得锁以后,其它线程必须等待当前线程

释放锁才能获得锁,悲观锁的实现往往依靠数据库的锁机制.

悲观锁存在的问题:1.

1.在多线程竞争的环境下,频繁地加锁、释放锁会导致比较多的上下问切换

2.一个线程拥有锁会导致其它要竞争此锁的线程挂起

 

乐观锁:非独占锁,非阻塞锁,乐观锁就是假设没有冲突去完成某项操作,如果发生冲突就重试,直到成功为止。

CAS:CAS是一项乐观锁技术,当多个线程尝试去更新某一个共享变量时,只有一个线程会更新成功,其他更新失败的线程

不会被挂起,并可以再次尝试。

CAS操作包含三个操作数:内置位置(V)预期原值(A)新值(B):如果内置位置的值和预期原值相匹配,处理器会将内置位置的值

更新为新值,否则处理器不做任何操作。CAS就是乐观锁思想的一种实现方式,也是非阻塞算法的一种实现。

J.U.C包就是建立在CAS之上的,没有锁的机制下要借助volatile

CAS容易出现的三个问题:

1. 注意:CAS可能导致ABA问题,就是一个线程1先将A变成B,然后又将数据变成A,此时线程1发现内置位置仍是A,就会操作成功,但并不代表这个

操作过程就没有问题。

解决ABA问题:部分乐观锁的实现是通过版本号(version)来解决ABA问题的,每次去修改/更新一个数据时,会带上版本号,一旦版本号和数据的版本号

一致时就会一致就可以执行修改/更新操作,并将版本号+1;

2.多线程竞争时,线程长时间拿不到锁会做无意义的自旋,给CPU资源带来一定程度的消耗。

3.只能保证一个共享变量的原子性操作

 

posted @ 2018-03-10 16:34  大熊好好写代码  阅读(835)  评论(0编辑  收藏  举报