栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ReentrantLock 重入锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ReentrantLock 重入锁

ReentrantLock

重入锁

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实现的–图片引用外部

类实例关系–图片引用外部

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336834.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号