乐观锁、悲观锁,实现一个乐观锁

悲观锁

    总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁。再比如java里面的同步原语synchronized关键字的实现也是悲观锁。

乐观锁

    总是认为不会产生并发问题,所以每次去取数据的时候总认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间有没有别人去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的业务场景,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

乐观锁的一种实现方式:

CAS

    乐观锁就是每次不加锁,假设没有并发冲突去完成某项操作,如果因为并发冲突失败就重试,直到成功为止。分为两个步骤:冲突检测和数据更新。其实现方式有一种比较典型的就是CAS。

    CAS是一种乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其他线程都失败,失败的线程并不会被挂起,而是被告知此次竞争中失败,并可以再次尝试。

    CAS中包含三个操作数,需要读写的内存位置V,进行比较的预期原值A和拟写入的新值B。如果内存位置V的值与预期原值A相匹配,那么就更新为B。否则不做任何操作。也就是说,我认为V处应该包含值A,如果包含A,那么将B放到这个位置,如果不包含A,不要更改该位置,只告诉我这个位置现在的值即可。

java对CAS的支持:

    在JDK1.5中新增java.util.concurrent就是建立在CAS之上的。相对于synchronized这种阻塞算法,CAS是非阻塞算法的一种常见实现。

https://www.cnblogs.com/qjjazry/p/6581568.html

猜你喜欢

转载自blog.csdn.net/hellodake/article/details/81977204