面试题答案
一键面试乐观锁原理
乐观锁假设在大多数情况下,并发操作不会发生冲突。在进行数据更新时,它不会像悲观锁那样先锁定数据。而是在更新数据前,先读取数据的版本号或时间戳等标识。当实际更新数据时,再次读取该标识,并与之前读取的标识进行比较。如果标识一致,说明在读取数据到更新数据期间,数据没有被其他线程修改,允许更新操作;如果标识不一致,则说明数据已被其他线程修改,更新操作失败,需要重试或采取其他处理方式。
乐观锁在并发控制中的优点
- 性能高:由于乐观锁在操作过程中不锁定数据,多个线程可以同时读取数据,只有在更新时才进行冲突检测,大大减少了锁的竞争,提高了系统的并发性能。
- 适合读多写少场景:对于读操作频繁,写操作相对较少的系统,乐观锁能充分发挥其优势,因为读操作不会被阻塞,整体系统性能会得到提升。
乐观锁在并发控制中的缺点
- 更新失败重试开销:如果并发冲突频繁,大量的更新操作会因为版本不一致而失败,需要不断重试,这会增加系统的开销,降低系统性能。
- 不适合高并发写场景:在高并发写的情况下,数据冲突的概率较高,乐观锁的优势难以体现,反而会因为大量的重试导致系统性能急剧下降。
适合使用乐观锁进行数据分区并发控制的实际业务场景
以电商系统中的商品库存管理为例。在该场景中,读操作(查询商品库存)远远多于写操作(扣减商品库存)。当用户查询商品库存时,不进行任何锁定操作,直接读取库存数据及版本号。当用户下单扣减库存时,先读取库存的当前版本号,然后尝试更新库存并带上之前读取的版本号。如果版本号一致,说明在查询库存到下单期间库存未被其他订单修改,扣减库存操作成功;如果版本号不一致,说明库存已被其他订单修改,下单失败,提示用户重试或库存不足。这样可以在保证数据一致性的同时,提高系统的并发处理能力。