java - 并发ConcurrentHashMap的问题
高洛峰
高洛峰 2017-04-18 10:56:54
0
3
994

这个问题的 说明有点长,

step1 并发map中的put

step2

step3

step4

step5

step6

step7

step8

step9

上面中steop3 表示重复尝试获取锁达到一定的次数之后就 调用lock阻塞当前线程

我想问的问题是关键在 step7 这个if中的tryAcquire 表示的是尝试获取锁,如果获取不成功就返回false,然后将创建一个Node 封装 当前线程添加到一个队列中
(1)其中if的第二个条件表示什么意思? ,好像不仅仅是获取一个节点那么简单的

(2)selfInterrupt 表示自我中断,中断不是说让当前线程放弃正在执行的任务吗(并不是立即放弃,是下次cpu检查的时候查看中断位是吗)

而我的理解是:这里的需求是需要将当前线程阻塞,因为当前线程始终获取不到锁,而这里的实现是使用了中断,中断可以阻塞线程吗?(平时使用中断不都是中断正在等待或者阻塞的线程吗?)

(3)其实最本质想问的是,ReentrantLock实现中 ,当一个线程多次尝试获取不到锁之后是如何阻塞当前线程的? 阻塞之后又是如何唤醒的

求各位开导呐

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(3)
洪涛

초대해 주셔서 감사합니다만, 우선 ConcurrentHashMap의 소스 코드를 직접 연구해 본 적이 없고, 인터뷰에서 그런 세부 사항을 묻는 것이 거의 불가능하기 때문에 정말 답변을 드릴 수 없습니다. 구아바와 같은 클래스 라이브러리를 직접 작성해야 하는 경우가 아니라면 이러한 내용을 연구하는 것은 의미가 없다고 생각합니다.

左手右手慢动作

초대해 주셔서 감사합니다. 죄송하지만 동시성에 대한 저의 지식은 아직 매우 제한적입니다. 답변할 수 있는 사람들을 초대할 수 있도록 도와드리겠습니다

洪涛

최대한 답변해 드리겠습니다.
질문(1)은 공정한 잠금 문제와 관련이 있습니다. 얻을 수 없는 경우에는 대기열에 노드를 삽입하세요. java.util.concurrent.locks.AbstractQueuedSynchronizer
질문에 집중하세요. (3) ) 이 부분의 구현은 하위 레이어에 따라 다릅니다. LockSupport

을 참조하세요. 으아악

unpark방법

을 사용하여 깨우기
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿