乐观锁和悲观锁

乐观锁悲观锁是常用的并发控制方式,主要用于保证多线程或多进程对共享资源的操作同时进行时,数据的正确性和一致性

乐观锁

        乐观锁是一种非阻塞式的并发控制方式,它假设多个线程(或进程)之间的操作不会互相干扰,可以同时操作同一个数据。在乐观锁中,每次操作时先获取数据的版本号(或时间戳),操作结束后再将更新后的版本号提交。如果两个线程同时获取到了同一个版本号,则其中一个线程需要进行回滚等处理。

优点:

  • 不会阻塞线程或进程;
  • 在并发量不高时,性能较好。

缺点:

  • 当有多个线程同时修改同一个数据时,会出现版本冲突的问题;
  • 需要维护数据的版本号或时间戳,增加了额外的存储开销。

 悲观锁

        悲观锁是一种阻塞式的并发控制方式,它假设多个线程(或进程)之间的操作会互相干扰,因此需要在访问共享资源时进行加锁操作,并且只允许同一时刻只有一个线程(或进程)访问数据。

优点:

  • 可以有效的避免数据竞争问题;
  • 不需要额外的存储开销。

缺点:

  • 当并发量较高时,由于每个线程都需要等待锁的释放,会降低程序的吞吐量和性能;
  • 阻塞式操作容易导致死锁问题的出现。

区别

        乐观锁和悲观锁是两种不同的并发控制方式,其区别主要在于处理并发访问共享资源的方式不同。乐观锁相对来说更加乐观,它假设多个线程(或进程)可以同时访问共享资源,而悲观锁则相对保守,它假设多个线程(或进程)会互相干扰,因此需要加锁操作来保证数据的正确性和一致性。
        悲观锁适用于并发量高、读写操作较为平均的场景,尤其是针对一些关键数据、敏感数据或者频繁进行修改操作的数据,使用悲观锁可以比较好地保证数据的正确性和一致性。而乐观锁则较少出现锁竞争的问题,因此在并发量较低、单纯的读取操作较为频繁的场景中,它会比悲观锁更加适用,且不需要维护锁状态,不存在锁的粒度问题。

总体来说,乐观锁适用于并发量不高、读取操作比较频繁的场景,而悲观锁适用于并发量高、读写操作较为平均的场景。在具体实践中,需要根据业务场景和具体需求来选择合适的并发控制方式(技术永远为业务服务)。

你可能感兴趣的:(Java,java,开发语言)