1. 程式人生 > >之前的部落格雖然是自己寫的,但是也得經常回顧啊。

之前的部落格雖然是自己寫的,但是也得經常回顧啊。

之前的部落格雖然是自己寫的,但是也得經常回顧啊。

剛才用到執行緒鎖,但是又不敢確定用什麼最好了。之前學習過,但使用不多,不夠深刻,也沒有很理解,有點遺忘了。

ReentrantLock 和Synchronized都是可重入鎖,即本執行緒擁有鎖以後可以再次執行進入鎖所相關的程式碼而不會阻塞,只是count+1。

1、ReentrantLock的鎖釋放需要程式碼層面的lock(),unLock(),final(),必須將unLock()放到final中,而synchronized是JVM層面的,出現異常後會自動釋放鎖

2、ReentranLock有多種方式,

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

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

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

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

3、在資源競爭不是很激烈的情況下,Synchronized的效能要優於ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的效能會下降幾十倍,但是ReetrantLock的效能能維持常態;

4、ReentranLock有公平鎖和非公平鎖兩種策略例項化,公平鎖是指當前執行緒A在擁有鎖的時候,其他執行緒如B來申請會等待,等A釋放的時候,會優先考慮B,而非公平的時候,是在A釋放的時候,所有等待的執行緒一起同等競爭,對於B來說是非公平的。