Java多執行緒系列(十九)一些鎖的概念

2021-09-22 14:14:42 字數 1380 閱讀 4339

1.可重入鎖與不可重入鎖

per-thread  同乙個thread中,獲取鎖之後再次使用同樣的方法或者物件中的其他方法可以直接操作,

而不需要重新獲取鎖。 它是基於thread粒度的,per-thread

舉例:

// 可重入鎖

public class lock

islocked = true;

lockedcount++;

lockedby = thread;

}public synchronized void unlock()}}

}

不可重入鎖

每次使用鎖方法時,都需要重新獲取鎖,即使在同一執行緒找那個呼叫同一方法都需要等待上乙個鎖的釋放

基於method粒度,per-invocation

舉例:

// 不可重入鎖

public class count

public void doadd()

}

2.公平鎖與非公平鎖

以請求鎖的順序來獲取鎖

比如同時有多個執行緒在等待乙個鎖,當這個鎖被釋放時,等待時間最久的執行緒(最先請求的執行緒)會獲得該鎖,這種就是公平鎖。

synchronized是非公平鎖,reentrantlock 和 reentrantreadwritelock可以設定為公平鎖

3.可中斷鎖與不可中斷鎖

synchronized就是不可中斷鎖,lock是可中斷鎖

如果某一線程a正在執行鎖中的**,另一線程b正在等待獲取該鎖,可能由於等待時間過長,執行緒b不想等待了,

想先處理其他事情,我們可以讓它中斷自己或在別的執行緒中中斷它,這種就是可中斷鎖。

4.讀寫鎖

本質是分成兩個鎖,讀鎖,寫鎖。

在讀鎖下,多個執行緒可以併發的進行訪問,但是在寫鎖的時候

只能乙個個順序訪問。

讀讀共享、寫寫互斥、讀寫 互斥

5.自旋鎖

與互斥鎖相似。與普通鎖不同的是,乙個執行緒a在獲得普通鎖後,如果再有執行緒b檢視獲取鎖,那麼這個執行緒b將會掛起()()(阻塞);

試想下,如果兩個執行緒資源競爭不是特別激烈,而處理器阻塞乙個執行緒引起的執行緒上下文的切換的代價高於等待資源的代價的時候(鎖的已保持者保持鎖時間比較短),那麼執行緒b可以不放棄cpu時間片,而是在「原地」忙等,直到鎖的持有者釋放了該鎖,這就是自旋鎖的原理,可見自旋鎖是一種非阻塞鎖。

問題:(1)過多佔據cpu時間

(2)死鎖問題

6 獨享鎖 vs 共享鎖

獨享鎖:指該鎖一次只能被乙個執行緒持有。

共享鎖:  該鎖可悲多個執行緒鎖持有

reentrantlock :獨享鎖

reentrantreadwritelock: 讀鎖是共享鎖,寫鎖是獨享鎖

十九 java多執行緒之ForkJoinPool

github fork join 框架 就是在必要的情況下,將乙個大任務,進行拆分 fork 成若干個小任務 拆到不可再拆時 再將乙個個的小任務運算的結果進行 join 彙總。system.out.println name 嗯,不錯,效率還可以,終於賺到 sum 元,趕緊邀功去.return sum...

java多執行緒 執行緒八鎖

乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,換句話說,某乙個時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件...

Java多執行緒 鎖物件

前面總結了多個執行緒訪問同乙個物件的同步方法以同步執行,多個執行緒訪問多個物件的同步方法則以非同步方式執行,那如果多個執行緒分別訪問乙個物件中同步方法和非同步方法會如何執行那?demo myobject類 包含了乙個同步方法和乙個非同步方法 public class myobject catch i...