java - 并发ConcurrentHashMap的问题
问题描述
这个问题的 说明有点长,
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实现中 ,当一个线程多次尝试获取不到锁之后是如何阻塞当前线程的? 阻塞之后又是如何唤醒的
求各位开导呐
问题解答
回答1:谢邀,不过实在无法回答,因为首先我自己没怎么研究过ConcurrentHashMap的源码,其次面试中几乎不太可能问到这么细节的地方。除非你自己需要写类似guava的类库,否则我感觉研究这些意义不是太大。
回答2:谢邀,不过很抱歉,鄙人对于并发相关的学习也还很有限。我帮你邀请可能会的人来回答吧
回答3:我能回答多少就回答多少吧问题(1)涉及到的是公平锁的问题,如果获取不到就插入Node到队列中去,重点关注java.util.concurrent.locks.AbstractQueuedSynchronizer问题(3)线程将自己挂起,这部分的实现是依靠底层的,参照LockSupport
public static void park(Object blocker) { Thread t = Thread.currentThread(); setBlocker(t, blocker); unsafe.park(false, 0L); setBlocker(t, null);}
唤醒用unpark方法
相关文章:
1. javascript - 求解答:实例对象调用constructor,此时constructor内的this的指向?2. Windows系统能否利用Docker使用Ubuntu吗?Ubuntu能使用本机的显卡吗?3. python的MySQLdb库中的executemany方法如何改变默认加上的单引号?4. python中生产者消费者线程问题5. html5 - 在一个页面中 初始了两个swiper 不知道哪里错了 一直不对6. css - chrome浏览器input记录上次cookie信息后,有个黄色背景~如何去除!7. mysql5.7就没有官方性质的详细配置文件吗?求大神告知8. 请教,关于python字典,合并相同值的键的实现方法9. android - 京东移动端网页和其app加载的url所做的呈现不应该是完全一样的吗?10. css3中translate(-50%,-50%)对 transform-origin的奇葩影响?

网公网安备