1. 程式人生 > >Java基礎-鎖機制

Java基礎-鎖機制

Java中的鎖機制

Lock不是Java語言內建的, synchronized是Java語言中的關鍵字, Lock是一個介面,通過這個介面可以實現同步訪問。
Lock允許更靈活的結構, 並可以支援多個相關類的條件物件。優勢在於: 使鎖更公平, 使執行緒在等待鎖的時候可以響應中斷; 可以讓執行緒嘗試獲取鎖, 並在無法獲取鎖的時候立即返回或等待一段時間。

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();

重入鎖(ReentrantLock)是一種遞迴無阻塞的同步機制,指的是當同一執行緒的外層函式獲得鎖之後, 內層的遞迴呼叫函式仍然可以獲取得到該鎖的程式碼。
一個例項:

class MyClass {
    public synchronized void method1() {
        method2();
    }

    public synchronized void method2() {
      
    }
}

上述程式碼中的兩個方法method1 和 method2 都用synchronized 關鍵字修飾, 假如某一個時刻, 執行緒A執行到了method1, 此時執行緒A獲取了該物件的鎖, 但是由於method2也是synchronized方法, 假如synchronized不具備可重入性, 那麼執行緒A需要重新申請一個鎖, 但是這會造成一個問題是執行緒A已經有了該物件的鎖,而又在申請該物件的鎖,產生了一個自環, 就會造成永遠等待。
ReentrantLock和synchronized

都可以得到可重入鎖

讀寫鎖: 針對讀寫操作的不同特點設計的鎖結構
公平鎖: 按照請求鎖的順序來獲取鎖。比如同樣是多個執行緒在等待一個鎖,當這個鎖被釋放時,等待時間最久的執行緒會獲得該鎖
可中斷鎖:可以中斷的鎖 syncrhonized不是可中斷鎖, Lock是可中斷鎖
如果執行緒A正在執行

樂觀鎖與悲觀鎖

悲觀鎖: 每次去拿資料都會上鎖, 傳統的關係型資料庫都會用到這種機制,比如行級鎖, 寫鎖
樂觀鎖: 每次讀資料認為別人不會修改,所以不會上鎖, 但是在更新的時候會判斷在此期間有沒有人更新這個資料,適用於讀操作多的情況