您的位置:首页 > 编程语言 > Java开发

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

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

synchronized

该关键字也是是jdk提供的一种隐性的锁机制,需要特别注意的有以下几点:

1、用在静态方法,锁的是类对象(类本身也是一个对象,是描述对象的对象),即class对象。

2、用在对象方法,锁的是通过类生成的对象。

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

ReentrantLock

在了解该锁的实现之前,需要对下面几个概念进行了解:

自旋锁:一个线程会一直在CPU上检测锁的条件是否满足,该锁的机制会使得线程一直占用CPU,比较适合短任务线程之间的锁的竞争(因为短任务的竞争不会导致线程上下文的切换)

CLH:CLH的讲解,这是一篇不错的文章

公平锁的实现

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

从上面可以看出如果线程阻塞在操作系统的锁的等待队列中,操作系统对线程的调度时随机的,无法控制顺序。但是在jdk中通过CLH来保证这种顺序关系,这种关系就类似于后面一个线程完全依赖于前一个线程的锁的占用情况,这种情况下就意味着后面进来的线程必须等待前面的线程对锁使用完毕之后,才能拥有对锁的争用权利(只是拥有竞争锁的权利,但是不一定能够保证能获取到锁,这个概念有点绕,是属于层是操作系统层面的概念了,不细讲,只要记住只是获取了争用锁的权利,而不是百分百保证能获取锁)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdk ReentrantLock