深入浅析ReentrantLock的实现原理

  介绍

深入浅析ReentrantL中实现内涵的原理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强> 1同步和锁

<强> 1同步和锁

同步是java内置的关键字,它提供了一种独占的加锁方式.synchronized的获取和释放锁由JVM实现,用户不需要显示的释放锁,非常方便,然而同步也有一定的局限性,例如:

当线程尝试获取锁的时候,如果获取不到锁会一直阻塞。

如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试获取锁必须一直等待。

JDK1.5之后发布,加入了Doug Lea实现的并发包。包内提供了锁类,用来提供更多扩展的加锁功能.Lock弥补了同步的局限,提供了更加细粒度的加锁功能。

锁api如下

空白锁();
  空白lockInterruptibly()抛出InterruptedException;
  布尔tryLock ();
  布尔tryLock(长时间,TimeUnit unit)抛出InterruptedException;
  空白解锁();
  条件newCondition (); 

其中最常用的就是锁定和解锁操作了因。为使用锁时,需要手动的释放锁,所以需要使用试试. .抓来包住业务代码,并且在最后中释放锁。典型使用如下

 

aq中还有一个表示状态的字段状态,例如ReentrantLocky用它表示线程重入锁的次数,信号量用它表示剩余的许可数量,FutureTask用它表示任务的状态,对状态变量值的更新都采用CAS操作保证更新操作的原子性。

AbstractQueuedSynchronizer继承了AbstractOwnableSynchronizer,这个类只有一个变量:exclusiveOwnerThread,表示当前占用该锁的线程,并且提供了相应的,集方法。

理解aq可以帮助我们更好的理解包本部同样高品质中的同步容器。

<强> 3锁定()与解锁()实现原理

ReentrantLock是锁的默认实现之一。那么锁定()和解锁()是怎么实现的呢?首先我们要弄清楚几个概念

可重入锁。可重入锁是指同一个线程可以多次获取同一把锁.ReentrantLock和同步都是可重入锁。

可中断锁。可中断锁是指线程尝试获取锁的过程中,是否可以响应中断.synchronized是不可中断锁,而ReentrantLock则提供了中断功能。

公平锁与非公平锁。公平锁是指多个线程同时尝试获取同一把锁时,获取锁的顺序按照线程达到的顺序,而非公平锁则允许线程“插”队.synchronized是非公平锁,而ReentrantLock的默认实现是非公平锁,但是也可以设置为公平锁。

CAS操作(CompareAndSwap) .CAS操作简单的说就是比较并交换.CAS操作包含三个操作数——内存位置(V),预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值,否则,处理器不做任何操作,无论哪种情况,它都会在中科院指令之前返回该位置的值.CAS有效地说明了”我认为位置V应该包含值,如果包含该值,则将B放到这个位置,否则,不要更改该位置,只告诉我这个位置现在的值即可。”Java并发包(Java . util . concurrent)中大量使用了中科院操作,涉及到并发的地方都调用了sun.misc。安全类方法进行CAS操作。

ReentrantLock提供了两个构造器,分别是

深入浅析ReentrantLock的实现原理