关于AQS的一点问题

ReentrantLock是组合自定义同步器来实现的,可是同步器的原理是靠同步队列实现的,而同步队列里的那些非head节点竞争锁的时候,都要检查其prev节点是否为head,这样就成了FIFO了,那这个可重入锁的非公平锁(随机获取锁)究竟是如何实现的呢??好奇怪啊,有大佬知道是怎么回事嘛😥😥😥

#Java工程师#
全部评论
跪等大佬
点赞 回复 分享
发布于 2019-08-05 18:40
非公平模式下执行lock方法,线程直接尝试获取同步状态,而不去管同步队列有没有节点在等待,这样就不是严格遵循FIFO了
点赞 回复 分享
发布于 2019-08-05 18:43
公平非公平是在两者tryacquire里不同,公平锁需要先检查同步队列有没有线程在等待,若没有则可以拿到锁,反之要进入队列等待,非公司锁则是竞争锁失败后才进入同步队列
点赞 回复 分享
发布于 2019-08-05 18:44
你看源码噻,非公平锁在创建节点加入同步队列之前会先常识获取锁和进行锁冲入,如果这个时候锁刚好被被释放,那就就可能插队获取到了,,否则被加入队列后,就真的只能fifo了
点赞 回复 分享
发布于 2019-08-05 18:45
我想问的不是tryAcquire方法,而是acquireQueued方法。。。
点赞 回复 分享
发布于 2019-08-05 18:54

相关推荐

2024-12-20 23:50
门头沟学院 Java
第一次写面经下面的内容是录音之后导出文本然后由gpt生成的,大致包含了所有面试官提问的问题。自我介绍- 请先自我介绍一下。- 介绍一下最近做的项目,这个项目是你自己一个人做的吗?- 这个项目是在单机去跑的吗?有没有上线过?技术难点- 做这个项目主要的技术难点在哪?- 秒杀逻辑的主要技术挑战是什么?- 在集群模式下考虑使用分布式锁吗?分布式锁与并发处理- 构造的分布式锁具体指的是什么?- 如何优化锁误删的问题?- 在锁误删中加锁和解锁的操作是如何实现的?- 在锁误删场景中,如果线程成功获取到锁,但该线程的业务逻辑执行时间超过锁的超时时间,如何处理?- 线程在感知到锁快要超时的时候,怎么进行续期操作?消息队列选择- 为什么考虑使用 Redis 的 string 结构作为消息队列?- 对其他的消息队列(如 RabbitMQ、Kafka)有什么了解?缓存相关问题- 什么是缓存穿透、缓存雪崩?- 如何防止缓存雪崩?- 解决缓存击穿的方法有哪些?并发控制- synchronized 和 lock 的区别是什么?- 在单台机器部署的情况下,如何对同一个用户加锁以确保接口的线程安全?(类似于同一用户用不同设备去下单,也就是不同线程同一userId,如何保证这里的线程安全)(除了userId字符串常量池引用,还可以设定synchronized锁的对象是哪些来达到同样的效果)- 如何获取用户 ID 对应的常量值以保证其唯一性?(intern方法)编程实践- 算法题LeetCode原题 复原ip地址,不允许定义全局变量,(因为时间不太够了,面试官就要求写出回溯方法的主体结构即可,然后解释以下函数中的参数什么含义)面试反问- 部门业务面向B端还是C端?面试环节有几轮?面试评价?)面试官建议- 在项目介绍时可以更深入一些,详细说明遇到的技术困难及解决方案。- 讨论技术选型的原因,即为什么选择某种技术而不是其他的,并解释这些技术的原理和可能存在的问题。#美团##牛客解忧铺##面经#
牛客826933393号:以后我写面经就按你这样写
查看21道真题和解析 牛客解忧铺
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
8
分享

创作者周榜

更多
牛客网
牛客企业服务