JUC AQS原理流程

2021-10-11 18:55:37 字數 2906 閱讀 5097

aqs指abstractqueuedsynchronizer, 抽象的佇列同步器

是用來構建鎖或者其他同步器元件的重量級基礎框架及整個juc體系的基石,通過內建的fifo佇列來完成資源獲取和執行緒的判斷工作,並通過乙個int型別變數,表示持有鎖的狀態

aqs使用乙個volatile的int型別成員變數來表示同步狀態,通過內建的fifo佇列來完成資源獲取和執行緒排隊工作,將暫時獲取不到鎖的執行緒加入到佇列中,這個佇列就是aqs的抽象表現.

它將請求共享資源的執行緒封裝成佇列的節點node,通過cas、自旋以及locksupport.park()的方式維護sate變數的狀態,使併發達到同步控制的效果

sate變數+clh變種的雙端佇列

aqs同步佇列的基本結構

// abstractqueuedsynchronizer內部類node

static final class node

aqs原始碼主要方法由lock()開始

// 分為公平fairsync和非公平nonfairsync

final void lock()

acquire()

public final void acquire(int arg)
tryacquire(arg); arg=1

final boolean nonfairtryacquire(int acquires) 

}// 可重入鎖

else if (current == getexclusiveownerthread())

return false;

}

addwaiter(node.exclusive)

private node addwaiter(node mode) 

}// 入隊

enq(node);

return node;

}private node enq(final node node) else }}

}

acquirequeued(addwaiter(node.exclusive)

final boolean acquirequeued(final node node, int arg) 

if (shouldparkafte***iledacquire(p, node) &&

parkandcheckinterrupt())

interrupted = true;

}} finally

}private static boolean shouldparkafte***iledacquire(node pred, node node) while (pred.waitstatus > 0);

pred.next = node;

} else

return false;

}private final boolean parkandcheckinterrupt()

addwaiter()入隊流程圖,雙向鍊錶中,第乙個節點為虛節點(哨兵節點),不儲存任何資訊,只是佔位.真正的第乙個有資料的節點,是從第二個節點開始的.

由unlock()釋放鎖

public void unlock() 

public final boolean release(int arg)

return false;

}protected final boolean tryrelease(int releases)

setstate(c);

return free;

}

unparksuccessor()

private void unparksuccessor(node node) 

if (s != null)

// 喚醒執行緒

locksupport.unpark(s.thread);

}

阻塞的執行緒被喚醒後,會繼續執行parkandcheckinterrupt()方法返回false

private final boolean parkandcheckinterrupt()
接著進入acquirequeued()方法繼續自旋,返回false

socket流程原理

網路由下往上分為 物理層 資料鏈路層 網路層 傳輸層 會話層 表示層和應用層。通過初步的了解,我知道ip協議對應於網路層,tcp協議對應於傳輸層,而http協議對應於應用層,三者從本質上來說沒有可比性,socket則是對tcp ip協議的封裝和應用 程式設計師層面上 也可以說,tpc ip協議是傳輸...

mybatis原理流程

無論是用過的hibernate,mybatis,你都可以法相他們有乙個共同點 從配置檔案 通常是xml配置檔案中 得到 sessionfactory.由sessionfactory 產生 session 在session 中完成對資料的增刪改查和事務提交等.在用完之後關閉session sqlses...

hadoop mapreduce原理和流程

參考 hadoop有不同版本之分,寫這篇文章的時候已經有版本3了,但是主要還是以版本二為主,1 2 的主要不同是在mapreduce部分 尤其是資源管理部分由原來的tasktracker jobtracker轉為了yarn,而計算部分沒變。另hdfs也沒怎麼變,作為乙個新手,試著記錄一下自己的理解吧...