Java鎖機制-重入鎖


鎖的種類:

讀寫鎖   悲觀鎖  樂觀鎖 CSA無鎖  自旋鎖  AQS 非公平鎖 公平鎖 互斥鎖 排它鎖  分布式鎖(redis實現 和 zk實現)

輕量級鎖(lock),重量級鎖(synchronize)

 

重入鎖

鎖作為並發共享數據,保證一致性的工具,在JAVA平台有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利。

重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之后 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。

鎖的特征是可以傳遞的,鎖是可以傳遞的,是方法遞歸進行傳遞 。是為了避免死鎖問題的

 

在JAVA環境下 ReentrantLock(顯式鎖、輕量級鎖)和Synchronized (內置鎖、重量級鎖)都是 可重入鎖

 廢話不多說,ReentrantLock(顯式鎖、輕量級鎖):

package SuoTest;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ChongruTest extends Thread {
   
    Lock lock =new ReentrantLock();
    
      @Override
    public void run() {
        set(); 
        
    }
    
   public  void  set(){
       try {
           lock.lock();
           System.out.println("set方法");
           get();
    } catch (Exception e) {
        // TODO: handle exception
    }finally {
        lock.unlock();
    }
      
   }
   public  void get(){
       System.out.println("lock 可以具備可重入性-get方法");
       try {
        lock.lock();
    } catch (Exception e) {
        // TODO: handle exception
    }finally {
        lock.unlock();
    }
   }
      
    public static void main(String[] args) {
        ChongruTest chongruTest =  new ChongruTest();
        chongruTest.start();
    }
}


運行結果:

 

Synchronized (內置鎖、重量級鎖):

 正常情況下釋放鎖的條件是 異常或者代碼運行完畢  

package SuoTest;

public class SynchronizeTest implements Runnable{
    public void run() {
        set();
    }
    public synchronized void set(){
        System.out.println("set方法");
        get();
    }
    public synchronized void get(){
        System.out.println("get方法");
    }
    
    public static void main(String[] args) {
        SynchronizeTest synchronizeTest = new SynchronizeTest();
        Thread t1 =  new Thread(synchronizeTest);
        t1.start();
        
    }
    
} 

set方法把鎖傳遞給了get方法,具備可重入性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM