常见的锁策略
乐观锁 vs 悲观锁
乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并发冲突进行检测,如果发现并发冲突了,则返回用户错误的信息,让用户决定如何去做。
悲观锁的问题:总是需要竞争锁,进而导致发生线程切换,挂起其他线程;所以性能不高。
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。
乐观锁的问题:并不总是能处理所有问题,所以会引入一定的系统复杂度。
读写锁
多线程之间,数据的读取方之间不会产生线程安全问题,但数据的写入方互相之间以及和读者之间都需要进行互斥。如果两种场景下都用同一个锁,就会产生极大的性能损耗。所以读写锁因此而产生。
读写锁(readers-writer lock),看英文可以顾名思义,在执行加锁操作时需要额外表明读写意图,复数读者之间并不互斥,而写者则要求与任何人互斥。
自旋锁(Spin Lock)
在线程在抢锁失败后会进入阻塞状态,放弃 CPU,需要过很久才能再次被调度。但经过测算,实际的生活中,大部分情况下,虽然当前抢锁失败,但过不了很久,锁就会被释放。基于这个事实,自旋锁诞生了。

本文探讨了乐观锁与悲观锁的区别,强调了乐观锁在并发控制中的应用。详细介绍了CAS(Compare and Swap)操作的工作原理,并讨论了由于CAS可能导致的ABA问题及其解决方案。同时,文章还涉及了自旋锁、读写锁和可重入锁的概念,以及Java中的synchronized锁的多种状态,如无锁、偏向锁、轻量级锁和重量级锁。
最低0.47元/天 解锁文章
464

被折叠的 条评论
为什么被折叠?



