多執行緒 CyclicBarrier

2021-09-28 21:41:35 字數 1914 閱讀 3407

public class cyclicbarriertest implements runnable	

@override

public void run() catch (exception e)

}}

@test

public void testcyclicbarrier()

try catch (interruptedexception e)

}

public int await() throws interruptedexception, brokenbarrierexception  catch (timeoutexception toe) 

}

也就是說本質上呼叫的是dowait方法,下面是dowait方法的原始碼

/**

* main barrier code, covering the various policies.

*/private int dowait(boolean timed, long nanos)

throws interruptedexception, brokenbarrierexception,

timeoutexception

int index = --count;

if (index == 0) finally

}// loop until tripped, broken, interrupted, or timed out

for (;;) catch (interruptedexception ie) else

}if (g.broken)

throw new brokenbarrierexception();

if (g != generation)

return index;

if (timed && nanos <= 0l)

}} finally

}

在提出問題前,先了解 lock 一波

參考

lock(), 如果獲取了鎖立即返回,如果別的執行緒持有鎖,當前執行緒則一直處於休眠狀態,直到獲取鎖

trylock(), 如果獲取了鎖立即返回true,如果別的執行緒正持有鎖,立即返回false;

trylock(long timeout,timeunit unit),如果獲取了鎖定立即返回true,如果別的執行緒正持有鎖,會等待引數給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false;

lockinterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前執行緒處於休眠狀態,直到或者鎖定,或者當前執行緒被別的執行緒中斷

reentrantlock鎖為什麼要定義乙個final的臨時變數來使用,而不是直接使用this.lock?

答:主要是因為為了確保可見性,this.lock是volatile型別,在使用時會需要重新整理快取變數直記憶體,在頻繁使用時有效能損耗。所以用臨時變數接管,可以提高效能。另外乙個原因,對於lock,在方法內的後續操作中是不允許有修改的,所以會定義乙個final型別的臨時變數,其實也就是有點相當於注釋的作用了

此方法是多個執行緒中呼叫的,呼叫此方法表示到達了屏障位置,並且每個執行緒呼叫此方法的時候都是需要通過計數來判斷是否全都到達屏障位置。但方法開始就加了鎖,而計數是在鎖範圍內的**執行的,也就是說應該是只有第乙個呼叫的執行緒才會執行計數,而後呼叫的所有執行緒都應該是拿不到鎖的,那這個計數是怎麼實現的呢?

答:因為鎖有是否重入的分類,剛好reentrantlock是重入鎖。

多執行緒 多執行緒原理

我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...

多執行緒(一) tomcat 多執行緒

web server允許的最大執行緒連線數還受制於作業系統的核心引數設定,通常windows是2000個左右,linux是1000個左右。1.編輯tomcat安裝目錄下的conf目錄下的server.xml檔案 maxthreads 150 表示最多同時處理150個連線,tomcat使用執行緒來處理...

多執行緒 理解多執行緒(一)

程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...