ホームページ  >  に質問  >  本文

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实现中 ,当一个线程多次尝试获取不到锁之后是如何阻塞当前线程的? 阻塞之后又是如何唤醒的

求各位开导呐

高洛峰高洛峰2717日前927

全員に返信(3)返信します

  • PHP中文网

    PHP中文网2017-04-18 10:58:54

    お誘いありがとうございますが、第一に私自身 ConcurrentHashMap のソースコードを勉強したことがなく、第二に面接でそのような詳細を聞くことはほぼ不可能であるため、本当に答えることができません。 guava のようなクラス ライブラリを自分で作成する必要がない限り、これらを研究することはあまり意味がないと思います。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 10:58:54

    ご招待ありがとうございます。申し訳ありませんが、同時実行関連の学習に関する私の知識はまだ非常に限られています。答えてくれそうな人を招待するのを手伝ってください

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:58:54

    できる限り答えます
    質問 (1) には公平なロックの問題が含まれます。取得できない場合は、java.util.concurrent.locks.AbstractQueuedSynchronizerjava.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問題 (3) スレッド自体がハングします。この部分の実装は、基礎となる層に依存します。LockSupport を参照してください。 リーリー

    ウェイクアップするには、unpark メソッドを使用します🎜

    返事
    0
  • キャンセル返事