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也沒怎麼變,作為乙個新手,試著記錄一下自己的理解吧...