鎖的種類:
讀寫鎖 悲觀鎖 樂觀鎖 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方法,具備可重入性