Java中常见的锁

  • 可重入锁:

    • a(b(c(d()))):只要外层已经获取了锁,内层可以直接使用,而无需等锁

  • 公平锁/非公平锁

    • 公平锁:按照抢锁的顺序一个个得锁;先来先得。维护公平性

    • 非公平锁:随机抢锁,没有顺序。手快者得。

  • 乐观锁/悲观锁

    • 乐观锁:写代码要乐观,觉得这个代码大多情况下不会产生竞争关系,真并发竞争了,在竞争的那个时候再加锁。 一般数据库 可以用version版本来做。

      • 数据库 每条记录 version 机制

      • AtomicInteger:无锁机制。利用CAS原理;比较并交换。不用加锁锁住别人。

    • 悲观锁

      • 写代码总比较悲观,上来就加锁。再执行代码

  • 无锁/偏向锁/轻量级锁/重量级锁

    • synchronized: 如果使用这种语法糖。jvm会自动控制加解锁的过程

      • synchronized就是抢对象头的锁标志位(2位 = 4种可能)

    • 1、00(无锁):代码不执行:默认是无锁;内存中不用有任何锁维护信息

    • 2、01(偏向锁):代码只有一个人执行:使用偏向锁

      • 锁是可重入的

      • 更多人再来抢锁,升级

    • 3、10(轻量级锁): jvm告诉抢锁的人,现在只有少量线程,你只需要自旋就能短时内得到锁

      • 优点:快

      • 缺点:非常耗费CPU资源

    • 4、11(重量级锁):jvm告诉抢锁的人,现在大量线程都在抢这个锁,短时间内等不到。使用线程通信机制等待,我到时候唤醒你。 wait()notify()

      • 优点:腾出CPU资源

      • 缺点:慢

    • JVM锁升级机制:synchronized; 00 -- 01 -- 10 -- 11 -- 00

    • 保证:总有一个偏向锁正在执行,还有一个在自旋,剩下的人在等待

  • 自旋锁

    • 利用while(true)机制一直疯狂重试

  • 读写锁、CountDownLatch(闭锁)、Semaphore(信号量)、CyclicBarrier(循环栅栏)

    • 读加读锁:都是读相当于无锁; 读锁是:共享锁。

    • 写加写锁:夹着写操作,读就等写完。 写锁是:排他锁。

  • 共享锁、排他锁

  • 表锁、行锁、间隙锁

    • InnoDB:修改数据如果不带索引。只能锁整张表

      • update aaa set a = a+1 where id=5

      • update aaa set a = a+1 where id=5

      • update aaa set a = a+1 where id=5

      • 以上从0-10000可以的

      • 精确锁住某一行

    • MyISAM:直接锁整张表

    • 间隙锁:一整段,部分记录;

  • ......

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值