资讯专栏INFORMATION COLUMN

Java中的锁之乐观锁与悲观锁

huangjinnan / 706人阅读

摘要:解决上问题在变量前添加版本号,将变成循环时间长开销大,因为自旋需要消耗只能保证一个共享变量的原子操作分类二重入锁支持重进入的锁,排它锁分类三读写锁一对锁,读锁,写锁,在同一时刻允许多线程访问

1、 分类一:乐观锁与悲观锁

  a)悲观锁:认为其他线程会干扰本身线程操作,所以加锁

                    i.具体表现形式:synchronized关键字和lock实现类

  b)乐观锁:认为没有其他线程会影响本身线程操作,所以不加锁

                    i.具体表现形式:java的原子类的递增操作

                   ii.原理:采用cas算法

  c)Cas算法:交换与比较

                    i.涉及三个数:需要读写的内存值V,进行比较的值A,要写入的新值B

                   ii.具体操作:若A=V,就用B更新V,否则不进行任何操作

                  iii.会用ABA问题:cas算法需要判断内存值V是否发生变化,如果a值变成b值然后又变回a值,cas算法就会无法判断,产生错误。解决上问题:在变量前添加版本号,将aba变成1a2b3c

                  iv.循环时间长开销大,因为自旋需要消耗cpu

                   v.只能保证一个共享变量的原子操作
2、 分类二

  a) 重入锁:支持重进入的锁,排它锁

3、 分类三

  a)读写锁:一对锁,读锁,写锁,在同一时刻允许多线程访问

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72804.html

相关文章

  • Java以及sychronized实现机制

    摘要:有可能,会造成优先级反转或者饥饿现象。悲观锁在中的使用,就是利用各种锁。对于而言,其是独享锁。偏向锁,顾名思义,它会偏向于第一个访问锁的线程,大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得。 理解锁的基础知识 如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。 基础知识之一:锁的类型 按照其性质分类 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获...

    linkin 评论0 收藏0
  • MySQL - 事务的启动 / 设置 / / 解——入门

    摘要:行级锁,页级锁,表级锁。闻其名知其意,比较少见的是页级锁,它锁定的是一组相邻数据。排他锁允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的读写。意向排他锁事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的锁。 废话 本篇的名字简直可以起成《事务操作:从入门到放弃》。 力图解决:在MySQL 5.5 版本及更高版本时,使用事务的完整流程和细节记录,而无需面对...

    iOS122 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<