jdk源码小记——锁机制(ReentrantLock源码解析)

锁的具体含义和使用方式,在操作系统里面已经有了比较详细的讲解,就不在这里赘述了。本小节主要讲解一下Java当中的锁的实现和使用(其实jvm是用c++写的,所以最终的实现和操作系统提供的锁机制有很大的干系)

synchronized
该关键字也是是jdk提供的一种隐性的锁机制,需要特别注意的有以下几点:
1、用在静态方法,锁的是类对象(类本身也是一个对象,是描述对象的对象),即class对象。
2、用在对象方法,锁的是通过类生成的对象。

其余的各种方式都符合这两种规则,可以根据不同的需求调整不同的锁的粒度

ReentrantLock
在了解该锁的实现之前,需要对下面几个概念进行了解:
自旋锁:一个线程会一直在CPU上检测锁的条件是否满足,该锁的机制会使得线程一直占用CPU,比较适合短任务线程之间的锁的竞争(因为短任务的竞争不会导致线程上下文的切换)
CLH:CLH的讲解,这是一篇不错的文章

公平锁的实现
多线程锁的争用的调度时随机的,那么如何保证线程对锁的争用是顺序进行的呢,CLH这种数据结构就是为了保证线程对锁的争用顺序的进行。

从上面可以看出如果线程阻塞在操作系统的锁的等待队列中,操作系统对线程的调度时随机的,无法控制顺序。但是在jdk中通过CLH来保证这种顺序关系,这种关系就类似于后面一个线程完全依赖于前一个线程的锁的占用情况,这种情况下就意味着后面进来的线程必须等待前面的线程对锁使用完毕之后,才能拥有对锁的争用权利(只是拥有竞争锁的权利,但是不一定能够保证能获取到锁,这个概念有点绕,是属于层是操作系统层面的概念了,不细讲,只要记住只是获取了争用锁的权利,而不是百分百保证能获取锁)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值