1. 程式人生 > >實戰Java高併發程式設計(一)走進併發世界

實戰Java高併發程式設計(一)走進併發世界

  1. 阻塞(blocking)一個執行緒是阻塞的,那麼其它的執行緒釋放資源之前,當前執行緒無法繼續執行。使用synchronized或者重入鎖會使執行緒這是。
  2. 無飢餓(starvation-free):對於非公平的鎖來說,系統允許高優先順序的執行緒插隊,會造成飢餓;而公平的鎖則不會造成飢餓。
  3. 無障礙(obstruction-free)是一種最弱的非阻塞排程。如果兩個執行緒無障礙的執行,那麼他們不會因為臨界區的問題導致一方被掛起。但如果大家一起修改了臨界區,那麼無阻礙執行緒就會對自己的修改進行回滾。如果臨界區中有嚴重的衝突,會導致所有執行緒會不斷回滾自己的操作,從而沒有一個執行緒能夠走出臨界區。
  4. 無鎖(lock-free)的並行是無障礙的,所有的執行緒都能嘗試對臨界區進行訪問。但不同的是,無鎖的併發保證必然有一個執行緒能夠在有限步內完成操作離開臨界區。運氣不好的執行緒還是會飢餓。
  5. 無等待(wait-free)在無鎖的基礎上更進一步進行擴充套件,它要求所有的執行緒丟必須在有限步內完成,這樣就不會引起飢餓問題。一種典型的無等待結構是RCU(Read-Copy-Update)。它的基本思想是,對資料的讀可以不加控制,因此所有的讀執行緒都是無等待的。寫資料時,先取得原資料的副本,然後只修改副本,並在合適的時候寫回。