乐观锁与悲观锁
乐观锁:
假设都是最好的情况,每次拿数据都认为别人不会修改。但是在更新操作时会判断在此期间要更新的此条数据有没有被修改。使用场景:多读的类型,可提高吞吐量。
主要实现方式:版本号机制、CAS算法
版本号机制:
数据库表中加version字段,每次修改version+1。线程1更新数据时,会先读取要更新的数据值和此version字段,在提交更新操作时会将version字段+1(a),和新要更新的数据值一起更新的数据库,但是在提交更新操作这个动作之前会将当前数据库的version值(b)和目前a做比较,若a大于b,则提交更新操作。
CAS算法:
即 compare and swap(比较与交换),是一种有名的无锁算法。无锁编程, 即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的 情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking
Synchronization)。CAS 算法涉及到三个操作数
需要读写的内存值 V
进行比较的值 A
拟写入的新值 B
当且仅当 V 的值等于 A 时,CAS 通过原子方式用新值 B 来更新 V 的值,否则 不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操 作,即不断的重试。
悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿 数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资 源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线 程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁 等,读锁,写锁等,都是在做操作之前先上锁。Java 中 synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现。
乐观锁与悲观锁
最新推荐文章于 2025-07-30 16:47:17 发布