返回
无锁的乐观与悲观
后端
2023-09-26 03:52:09
在谈论无锁的概念时,总会关联起乐观派与悲观派,对于乐观派而言,他们认为事情总会往好的方向发展,总是认为坏的情况发生的概率特别小,可以无所顾忌地做事,但对于悲观派而言,他总是认为最坏的情况随时可能发生,因此他们总是做最坏的打算。
在并发编程中,无锁编程是一种不使用锁来保护共享数据的编程范例。它可以提高程序的性能和可扩展性,但同时也增加了编程的复杂性。乐观和悲观是无锁编程中两种截然不同的思想。
乐观派
乐观派认为,在多线程环境下,并发访问共享数据时,冲突发生的概率很小,因此可以不加锁地直接访问共享数据。如果发生了冲突,再使用某种机制来解决。例如,可以使用CAS(Compare-And-Swap)指令来实现无锁的原子操作。CAS指令可以保证在多线程环境下,只有一个线程能够修改共享数据。
悲观派
悲观派认为,在多线程环境下,并发访问共享数据时,冲突发生的概率很大,因此需要在访问共享数据之前先获取锁。获取锁后,其他线程就不能访问共享数据,从而避免了冲突。例如,可以使用互斥量(Mutex)来实现悲观的无锁编程。互斥量可以保证在多线程环境下,只有一个线程能够访问共享数据。
如何选择合适的方法?
在实际应用中,我们应该根据具体情况来选择合适的无锁编程方法。如果我们认为冲突发生的概率很小,那么可以使用乐观派的无锁编程方法。如果我们认为冲突发生的概率很大,那么可以使用悲观的无锁编程方法。
乐观派的无锁编程方法
乐观派的无锁编程方法主要包括以下几种:
- CAS(Compare-And-Swap)指令:CAS指令可以保证在多线程环境下,只有一个线程能够修改共享数据。
- 乐观并发控制(Optimistic Concurrency Control,OCC):OCC是一种乐观派的并发控制机制。它允许多个线程同时修改共享数据,并在提交修改时才检查是否有冲突。如果发生冲突,则回滚修改并重试。
- 非阻塞算法:非阻塞算法是一种不使用锁来实现并发编程的算法。非阻塞算法可以保证在多线程环境下,多个线程能够同时访问共享数据,而不会发生冲突。
悲观的无锁编程方法
悲观的无锁编程方法主要包括以下几种:
- 互斥量(Mutex):互斥量是一种悲观的无锁编程方法。它可以保证在多线程环境下,只有一个线程能够访问共享数据。
- 自旋锁(Spinlock):自旋锁是一种悲观的无锁编程方法。它允许多个线程同时尝试获取锁,但是只有一个线程能够成功获取锁。其他线程需要不断地自旋,直到锁被释放。
- 读写锁(Read-Write Lock):读写锁是一种悲观的无锁编程方法。它允许多个线程同时读共享数据,但只有一个线程能够写共享数据。