java併發 重入鎖 ReentrantLock

2021-09-03 06:40:31 字數 2047 閱讀 7245

使用[github主頁](

重入鎖,標識在乙個執行緒中,可重複對該資源重複加鎖。

針對於aqs實現重入功能

在重寫tryaquires***的時候考慮同乙個執行緒多次lock的情況即可

偽**

thread currentthread = thread.currentthread();

//getexclusiveownerthread() 標識獨佔模式下的當前執行緒物件引用

if(currentthread == getexclusiveownerthread())

protected final boolean tryrelease(int releases) 

//這裡,就是當前執行緒獲取了多次

//比如1.lock() 2.lock() 3.unlock() 4.unlock

//這裡reentrantlock的aquire()方法傳入的是1

//執行1,2後state分別是 1,2

//執行3 c = 2-1 //setstate(2-1)

//執行4 c = 1-1 //直接釋放

setstate(c);

return free;

}

node鍊錶 head–>n1(pre,next)–>n2(pre,next)

//true 標識在佇列中的該執行緒擁有前置節點

//false 該執行緒是head或者 null==null即空佇列 tail==head==null

public final boolean hasqueuedpredecessors()

protected final boolean tryacquire(int acquires)

}else if (current == getexclusiveownerthread())

return false;

}

公平鎖最終獲得鎖的順序和佇列中的順序是一致的,fifo

為什麼?

aqs操作雖然使用cas無鎖操作機制,但是,cpu在排程的時候,切換至該執行緒的時候,該執行緒去獲取該資源鎖,但是fifo原則,無法獲取鎖,將處於自旋操作,後續執行緒任務無法執行,cpu排程結束,就切換至下乙個執行緒。

公平鎖大大的增加了cpu執行緒排程次數,導致吞吐率(tps)降低

/**

* describe:

* e-mail:[email protected] date:2018/12/16

* * @since 0.0.1

*/public

class

reentrantlocktest

@override

public

void

run(

)catch

(exception e)

finally}}

public

static

void

main

(string[

] args)

system.out.

println

(null == null);}

}

不公平鎖

公平鎖

Java 高併發程式設計 重入鎖 面試題

public class reentrantlock5 extends threadfinally public static void main string args reentrantlock還可以指定為公平鎖什麼是公平鎖,什麼是不公平鎖,假設很多個執行緒訪問同乙份資源的時候都要鎖定,其中某乙...

可重入鎖 不可重入鎖

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...

java重入鎖 公平鎖和非公平鎖

鎖的重入是指同乙個執行緒可以多次獲取同乙個鎖,synchronize是隱式的可重入鎖,reentrantlock通過 實現了鎖的重入 final boolean nofairtryacquire int acquires else if current getexclusiveownerthread...