悲观锁:
悲观锁就是假设每次操作都会有其他人使用同一个资源, 所以每次执行过程都是; 加锁-->使用资源-->释放锁, 项目中常使用synchronized对需要的代码部分加锁。
使用synchronized主要是因为synchronized使用的是内置锁, 加锁和解锁都由jdk实现, 使用者无需手动控制, 比较方便。
使用场景多是多线程开发时, 并行处理数据, 对方法或者代码块使用。
在使用时, 可尽量减少synchronized修饰的方法或代码块中的代码, 减少资源消耗。
乐观锁:
相对于悲观锁, 在并发量不大的小项目开发过程中比较常用乐观锁。 乐观锁是假设大多数操作情况下不会有其他人使用同一个资源。 执行过程一般是:获取资源快照-->使用资源-->确定资源没改变-->更新。
乐观锁主要由两种实现方式: 一种是版本号控制, 一种是CAS算法。 在日常开发中, 我比较常用前者。
使用场景如下:
在数据库表A中加字段x用于记录版本号,用户N需要修改A中某条记录
N打开信息编辑页面(打开页面时获取A表中某条记录数据),编辑页面字段并返回给后端(返回内容包括修改后的字段值和这条记录对应的版本号值)
后端获取数据库中对应记录中的版本号值, 与N前端返回回来的版本号值进行比较
如两个版本号一致, 则对版本号值加1, 同用户N修改后的值一起update。
以上这种方式并不是完全安全的, 所以只是用在并发不大且对数据要求不是特别严格的情况下。