627
京東網上商城
java鎖的種類以及辨析(一):自旋鎖
鎖作為並發共享數據,保證一致性的工具,在JAVA平台有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本係列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。
1、自旋鎖
自旋鎖是采用讓當前線程不停地的在循環體內執行實現的,當循環的條件被其他線程改變時 才能進入臨界區。如下
01 |
public class SpinLock {
|
03 |
private AtomicReference<Thread> sign = new AtomicReference<>();
|
06 |
Thread current = Thread.currentThread();
|
07 |
while (!sign .compareAndSet( null , current)){
|
11 |
public void unlock (){
|
12 |
Thread current = Thread.currentThread();
|
13 |
sign .compareAndSet(current, null );
|
使用了CAS原子操作,lock函數將owner設置為當前線程,並且預測原來的值為空。unlock函數將owner設置為null,並且預測值為當前線程。
當有第二個線程調用lock操作時由於owner值不為空,導致循環一直被執行,直至第一個線程調用unlock函數將owner設置為null,第二個線程才能進入臨界區。
由於自旋鎖隻是將當前線程不停地執行循環體,不進行線程狀態的改變,所以響應速度更快。但當線程數不停增加時,性能下降明顯,因為每個線程都需要執行,占用CPU時間。如果線程競爭不激烈,並且保持鎖的時間段。適合使用自旋鎖。
注:該例子為非公平鎖,獲得鎖的先後順序,不會按照進入lock的先後順序進行。
最後更新:2017-05-23 16:34:17