重入锁
static Lock lock = new ReentrantLock();
public void inc(){
//没有抢占到锁,会阻塞
lock.lock();
try{
count++;
}finally{
lock.unlock();
}
}
实现原理
1.一个标记位,判断当前状态;一个线程对象用于保存当前执行的线程;一个线程队列,用于排队等待线程执行完成
2.lock方法首先判断当前状态,如果为0,则将当前对象写入执行对象中,如果不为0则将线程放入等待队列尾部(或者放入插队队列中,不公平锁机制)公平锁是如果为0并且队列中没有数据将线程放入执行对象;不公平锁不会判断队列中是否有线程在等待
3.线程队列中线程会进行一次自旋,判断标记位是否可以去抢占,如果可以则将自身放入执行对象中,同时删除队列数据;如果不能抢占则调用locksupport.part阻塞本身,等待唤醒
4.线程执行完后,会调用unlock解锁,unlock会将标记恢复为0,同时会从队列中获取第一个队列进行unpark唤醒,唤醒后线程再次获取状态是否可以执行(这里就体现不公平锁的实现方法了,可以直接先将插队线程先执行,那么队列中的线程就获取不到标志了);然后继续循环操作
AbstractQueuedSynchronizer(AQS)上面的原理是基于AQS实现的–图片引用外部
类实例关系–图片引用外部



