SachinBeyond:final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {//這個地方是擷取鎖
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
我們知道 AQS 有一個等待隊列存放 因擷取不到鎖而阻塞的線程節點。
從上面的 實作中我們也看到 當鎖被釋放的時候 喚醒下一個節點線程的規則是 擷取 head 節點的 next 節點作為下一個要被喚醒的節點,然後讓這個節點嘗試擷取鎖,也就是 if (p == head && tryAcquire(arg)) 。 判斷目前節點的前屈是否是 head,如果是就嘗試擷取鎖。當 if 執行成功的時候就會退出 for 循環
問題: ( 1 ) for 死循環僅有一種退出方式(上面提到的 )嗎?
( 2 )我們不是說 ReentrantLock 等待可中斷嗎? 但是從 for 死循環中 我們看到即使你 中斷了 也退出不 for 循環吧?
SachinBeyond:final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
Java:正規表達式模式比對器是否有大小限制? - java
我的模式類似于OR:“word1 | word2 | word3”我大約有800個字。可能有問題嗎? 參考方案 您僅受記憶和理智的限制。 :)Java:線程池如何将線程映射到可運作對象 - java
試圖繞過Java并發問題,并且很難了解線程池,線程以及它們正在執行的可運作“任務”之間的關系。如果我建立一個有10個線程的線程池,那麼我是否必須将相同的任務傳遞給池中的每個線程,或者池化的線程實際上隻是與任務無關的“勞工無人機”可用于執行任何任務?無論哪種方式,Executor / ExecutorService如何将正确的任務配置設定給正确的線程? 參考方案 …在Zip檔案中以程式設計方式建立連結-Java - java
我正在使用ZipOutputStream建立一個zip檔案。也将有一個清單檔案(一個csv檔案),該檔案具有指向Zip檔案中條目的連結。如何以程式設計方式為zip條目建立連結? 參考方案 如果在編寫它們時跟蹤所有條目,則應該能夠添加另一個包含“連結”的條目(但是csv如何連結到檔案?請指定要實作的目标)。如果打算在Windows下使用該檔案,則可以以程式設計方式建立…Java:我可以在Hashmaps中使用數組嗎? - java
我可以在Hashmaps中使用數組嗎?如果是這樣,則聲明這種哈希圖的确切文法是什麼?謝謝 參考方案 數組也是對象。甚至像int[]這樣的原始數組。Map map = new HashMap();JAVA:位元組碼和二進制有什麼差別? - java
java位元組代碼(已編譯的語言,也稱為目标代碼)與機器代碼(目前計算機的本機代碼)之間有什麼差別?我讀過一些書,他們将位元組碼稱為二進制指令,但我不知道為什麼。 參考方案 位元組碼是獨立于平台的,在Windows中運作的編譯器編譯的位元組碼仍将在linux / unix / mac中運作。機器代碼是特定于平台的,如果在Windows x86中編譯,則它将僅在Win…