Java手寫自己的lock

2021-09-23 13:18:55 字數 1672 閱讀 7035

基礎:需要熟悉juc工具包以及底層的cas原理和aqs

接下來我們正入主題

第一種最簡單的方法,使用工具類來實現簡單的同步

我們可以使用atomicreference來操作當前,當然也可以使用semaphore,阻塞佇列等,這樣可以實現簡單的鎖,達到同步的效果。

public class ablelock 

}public void unlock()

}

接下來我們測試一下

public class testlock 

public int getcount()

public static void main(string args) throws interruptedexception

});thread.start();

//先讓其他的執行緒執行,最後主線程再輸出count的值

thread.join();

}system.out.println("count的值是"+testlock.getcount());}}

可以看出我們的結果已經達到了,但是這樣的鎖功能沒有那麼強大,只能實現簡單的同步,不可重入,太多缺陷

第二種就是通過實現lock介面,定義乙個內部類,通過繼承aqs(abstractqueuedsynchronizer)類達到排它鎖,這裡涉及到了模板設計模式

內部類繼承aqs後,需要重寫這幾個方法

isheldexclusively()
tryacquire(int arg)
tryrelease(int arg)
public class selflock implements lock 

@override

protected boolean tryacquire(int arg)

return false;

}@override

protected boolean tryrelease(int arg)

setexclusiveownerthread(null);

setstate(0);

return true;

}public condition newcondition()

}private sync sync=new sync();

@override

public void lock()

@override

public void lockinterruptibly() throws interruptedexception

@override

public boolean trylock()

@override

public boolean trylock(long time, timeunit unit) throws interruptedexception

@override

public void unlock()

@override

public condition newcondition()

}

這樣也就實現了鎖的效果

java執行緒Lock的wait

如果lock在lock.lock 之後進入lock.wait 那麼所有的獲取lock.lock 的 都會被阻塞。但是synchronized lock 這個 可以被執行,且只有執行喚醒之後才能使得程式繼續走。看 class r1 implements runnable catch interrupt...

Java多執行緒 Lock

reentrantlock可以和synchronized達到一樣的效果,並且擴充套件功能上也更加強大,而且使用更加靈活。lock lock new reentrantlock 加鎖 lock.lock 取消鎖 lock.unlock 等待通知模式 synchronized與wait 和notify方...

自己動手寫bootloader

原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...