乐观锁悲观锁
乐观锁
乐观锁的核心思想是“尽量不去锁定资源,而是尽量让线程并发地工作”,并在最后阶段检查冲突,只有在检测到冲突时才会采取纠正措施。乐观锁通常通过以下方式实现:
- 版本号控制:每次对共享资源进行修改时,都会更新一个版本号。线程在读取资源时会记录版本号,修改时会检查版本号是否变化。如果没有变化,修改成功;否则,重试。
- CAS(Compare-And-Swap):这是乐观锁的一种常见实现。CAS操作原子地比较变量的当前值和期望值,如果相等则更新为新值,否则重试。
应用场景:
- 读操作远多于写操作的场景:在这种情况下,冲突的概率较小,乐观锁可以减少锁的开销,提高系统的并发性能。
- 性能要求高:乐观锁因为不需要频繁的加锁和解锁,通常比悲观锁的性能更好。
- 短时间内的冲突检测:乐观锁适用于冲突比较少的场景,如果冲突频繁,则可能导致大量的重试,影响性能。
悲观锁
悲观锁的核心思想是“总是认为会发生冲突”,所以在访问共享资源时会对其加锁,以确保其他线程不能同时修改。这种方式确保了线程在操作资源时的互斥性。常见的悲观锁有:
- 互斥量(Mutex):使用互斥量可以保证在同一时间只有一个线程可以访问某个共享资源。
- 读写锁(Read-Write Lock):允许多个线程同时读取,但在写入时会锁定,确保写操作的独占性。
应用场景:
- 写操作频繁的场景:当对共享资源的写操作频繁时,悲观锁可以有效地保护数据一致性。
- 冲突概率高的情况:当系统中存在多个线程频繁地争用共享资源时,悲观锁可以避免冲突带来的问题。
- 需要强一致性:在一些要求数据强一致性的场景中,悲观锁可以确保数据的一致性,尽管会牺牲一些性能。