1.ReentrantLock原理介绍
ReentrantLock锁的获取也是基于AQS(AbstractQueuedSynchronizer)来实现的. AQS它是一个同步工具,它有两个功能一个是独占,独占就是说只有一个线程可以获取锁,也就是互斥。另外一个是共享.,共享就是可以有多个线程可以获取锁,像读写锁就是共享的。
在AQS当中维护了一个双向链表,当线程发生竞争时,它会将线程封装成一个Node节点加入到链表当中,该Node当中有prev,next属性用来指向上一个节点跟下一个节点。
2.锁的获取
在获取锁时有公平锁跟非公平锁,本篇文章以非公平的锁的方式说明,进入到lock方法中。在lock方法中一上来先获取锁,进入到compareAndSetState方法中是通过jvm提供的unsafe来保证原子操作,如果内存值与预期值相等则进行修改,否则不修改。compareAndSetState参数0表示无锁状态,1表示有锁状态。当获取锁以后会将exclusiveOwnerThread设置为当前线程所拥有锁。获取锁还是很简单的。主要看下锁的竞争
/**
第一个参数this表示操作对象
第二个参数stateOffset表示当前内存的偏移量
第三个参数expect表示预期值
第四个参数update表示需要修改的值
*/
unsafe.compareAndSwapInt(this, stateOffset, expect, update);
final void lock() {
//通过CAS保证原子操作,获取锁 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else
//锁的竞争 acquire(1); }
3.锁的竞争
假设现在有三个线程ThreadA,ThreadB,ThreadC同时去获取锁,假设线程A调用lock方法先获取到锁,那么这时线程B,C进入到lock方法时这时就会走到acquire方法进入锁的竞争。
更多关于锁的竞争,链表结构是怎么形成的,更多内容请扫码关注本人公众号获取
结语
获取更多内容请扫码关注公众号"零壹工厂"!!!! 微信号 : hy4245616