可重入鎖 不可重入鎖

2022-09-17 18:39:08 字數 1626 閱讀 3139

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖(前提是同乙個物件或者類)

note:

reentrantlock和synchronized都是可重入鎖

1

public

class

testlock 78

public

synchronized

void test2() throws

interruptedexception

1213

public

static

void main(string args) throws

interruptedexception

17 }

上面的**就是乙個可重入鎖的乙個特點,如果不是可重入鎖的話,test2可能不會被當前執行緒執行,可能造成死鎖。 

不可重入鎖,與可重入鎖相反,不可遞迴呼叫,遞迴呼叫就會發生死鎖。

使用自旋鎖來模擬乙個不可重入鎖

1

import

j**a.util.concurrent.atomic.atomicreference; 23

public

class

unreentrantlocktest

1314

private

static

void

test()

2122

private

static

class

unreentrantlock

34}

35}

3637

public

void

unlock()

44}

45 }

note:

使用原子引用來存放執行緒,同乙個執行緒兩次呼叫lock()方法,如果不執行unlock()釋放鎖的話,第二次呼叫自旋的時候就會產生死鎖,這個鎖是不可重入的

修改上述**,將它改造成可重入鎖,在執行每次操作之前,判斷當前鎖持有者是否是當前物件,採用state計數

1

import

j**a.util.concurrent.atomic.atomicreference; 23

public

class

reentrantlocktest

1314

private

static

void

test()

2324

private

static

void

test1()

3132

private

static

class

reentrantlock

4344

for(; ; )

49}

50}

5152

public

void

unlock() else

61} 62

} 63

} 64 }

可重入鎖和不可重入鎖

當乙個執行緒獲得當前例項的鎖lock,並且進入了方法a,該執行緒在方法a沒有釋放該鎖的時候,是否可以再次進入使用該鎖的方法b?不可重入鎖 在方法a釋放鎖之前,不可以再次進入方法b 可重入鎖 在方法a釋放該鎖之前可以再次進入方法b 如reentrantlock和synchronized 不可重入鎖的實...

可重入鎖和不可重入鎖

可重入鎖就是可以迴圈迭代使用的鎖,不會產生死鎖的現象,典型的就是synchronized和reentrantlock。不可重入鎖迴圈迭代使用則有產生死鎖的風險。可重入鎖 class reentranttest implements runnable public synchronized void ...

可重入鎖和不可重入鎖

鎖就是把 塊 資源或資料 稱為臨界資源 鎖上,訪問臨界資源的時候只允許乙個執行緒去操作,其他執行緒必須等待或者放棄,這是為了保證最終程式的正確執行。public class lock islocked true public synchronized void unlock 使用上面定義的lock鎖...