浅谈探讨乐观锁与悲观锁及volatile关键字

先来说说什么是乐观锁 什么是悲观锁 其实从他的名字就可以看出 悲观锁自己总是很悲观 认为每次对方都会进行修改 所以拿数据的时候都会上锁 最为经典的就是Java中的synchronized关键字 关系型数据库中也运用到悲观锁 比如 行锁 表锁  乐观锁即为认为对方每次不会修改数据 所以不会上锁 但是更新的时候就会判断一下数据是否被修改 一 例如数据库里面就是用了version字段来控制版本号  咱们先来看看下面这个代码 顺便一提MYSQL默认引擎为innerDb 为行锁 myisam为表锁 行锁为只锁一行

<update id="updateStatus">
    UPDATE pay_order_flow
    SET
      status=#{status},
      memo=#{memo},
      version = version+1
    WHERE
        id=#{id}
    AND version = #{version}
</update>

假设在多线程的环境下 如果执意使用悲观锁直接锁住会即大的降低效率  但是如果用乐观锁做的话  假设有两个线程进来 那么version一开始都是1 第一个线程更新完操作后会把version改为2 那么第二个线程继续执行操作的时候发现他自己的version为1而数据库的version为2 这样数据就无法更改了 就可以在提升效率的前提下保证数据的安全。悲观锁举例为forupdate行锁。乐观锁是基于业务层的 在代码上实现 悲观锁是基于数据库

最后提一下 Java中比较常用的锁关键字是synchronized(这个不用解释了吧)还有volatile 相比较synchronization 而言synchronized关键字是防止多个线程同时执行一段代码 那么就会很影响程序执行效率 而volatile关键字在某些情况下性能要优于synchronize 如果一个成员变量被volatile修饰 那么其就具备了两个特性 一个是保证了其可见性 另一个是紧张了指令的重排序 可见性就是如果一个线程更新了数据 那么其他线程都会立刻看到其修改的值 从而是其他线程值变为无效 在需要的时候会重新读取 保证了线程的安全 禁止指令重排序其实我们在写代码时 程序并非自上往下执行的 为了提高效率 可能会对代码优化 在保证结果结果一致的情况下对代码先后顺序进行更改 使用了volatile就避免了这样的情况 不过volatile并不能完全替代synchronized 因为并不能保证其原子性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值