Java中锁的原理

为什么要用锁?

锁-是为了解决并发操作引起的脏读、数据不一致的问题。

说起Java中的锁,其实大部分人第一反应就是synchronized,我们可以把这个关键字放到方法或者代码块上,表示使用某一个对象作为锁,去同步这个方法或者代码块。在Java中任何非NULL对象(我们称这个对象为锁对象)都可以作为一把锁给synchronized使用,这就是我们常说的内置锁,也叫监视锁。多个线程只有去访问同一个监视锁保护的临界区时才会发生竞争。

synchronized实现原理

synchronized是基于Monitor来实现同步的。

Monitor从两个方面来支持线程之间的同步:

  • 互斥执行

  • 协作

  • synchronized锁是阻塞的

    如果线程1试图去获取监视锁,失败之后,线程1会加入到阻塞队列中等待锁的释放。

  • 内置锁是不公平锁

    公平锁指的是,比如一把锁现在正在被线程1持有,此时线程2试图获取锁,当然线程2会失败,然后放到阻塞队列中,如果线程1长时间持有锁,那么阻塞队列中的线程会越来越多;如果此时线程1使用锁完毕,开始释放锁,此时,JVM会唤醒那个线程呢?如果是按照加入阻塞队列的顺序来依次唤醒,那么就是公平锁;否则,就是非公平锁;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值