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

这个问题的 说明有点长,

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的源碼,其次面試中幾乎不太可能問到這麼細節的地方。除非你自己需要寫類似guava的類別庫,否則我覺得研究這些意義不是太大。

左手右手慢动作

謝邀,不過很抱歉,鄙人對於併發相關的學習也還很有限。我幫你邀請可能會的人來回答吧

洪涛

我能回答多少就回答多少吧
問題(1)涉及到的是公平鎖的問題,如果獲取不到就插入Node到隊列中去,重點關注java.util.concurrent.locks.AbstractQueuedSynchronizerjava.util.concurrent.locks.AbstractQueuedSynchronizer
问题(3)线程将自己挂起,这部分的实现是依靠底层的,参照LockSupport問題(3)線程將自己掛起,這部分的實現是依靠底層的,參考LockSupport

public static void park(Object blocker) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    unsafe.park(false, 0L);
    setBlocker(t, null);
}

喚醒用unpark方法

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!