Maison > Questions et réponses > le corps du texte
这个问题的 说明有点长,
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实现中 ,当一个线程多次尝试获取不到锁之后是如何阻塞当前线程的? 阻塞之后又是如何唤醒的
求各位开导呐
PHP中文网2017-04-18 10:58:54
Merci pour l'invitation, mais je ne peux vraiment pas répondre car d'une part je n'ai pas étudié moi-même le code source de ConcurrentHashMap, et d'autre part il est presque impossible de demander de tels détails dans l'interview. À moins que vous n'ayez besoin d'écrire vous-même une bibliothèque de classes comme Guava, je ne pense pas que cela ait beaucoup de sens de les étudier.
ringa_lee2017-04-18 10:58:54
Merci pour l'invitation, mais je suis désolé, mes connaissances en simultanéité sont encore très limitées. Laissez-moi vous aider à inviter des personnes qui pourront peut-être répondre
PHP中文网2017-04-18 10:58:54
Je répondrai à autant de personnes que possible
La question (1) concerne le problème du verrouillage équitable. Si vous ne parvenez pas à l'obtenir, insérez le nœud dans la file d'attente java.util.concurrent.locks.AbstractQueuedSynchronizer
Question. (3) ) Le fil se suspendra. L'implémentation de cette partie dépend de la couche sous-jacente. Veuillez vous référer à LockSupport
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
unsafe.park(false, 0L);
setBlocker(t, null);
}
Réveillez-vous en utilisant la unpark
méthode