Mysql8.0.26安裝 Windows
阿新 • • 發佈:2022-01-24
Lock(鎖)
- 從JDK 5.0開始,Java提供了更強大的執行緒同步機制——通過顯式定義同步鎖物件來實現同步。同步鎖使用Lock物件充當
- java.util.concurrent.locks.Lock介面是控制多個執行緒對共享資源進行訪問的工具。鎖提供了對共享資源的獨佔訪問,每次只能有一個執行緒對Lock物件加鎖,執行緒開始訪問共享資源之前應先獲得Lock物件
- ReentrantLock類實現了Lock,它擁有與synchronized相同的併發性和記憶體語義,在實現執行緒安全的控制中,比較常用的是ReentrantLock,可以顯式加鎖、釋放鎖。
package com.wang.multiThread.gaoji; import java.util.concurrent.locks.ReentrantLock; //測試Lock鎖 public class TestLock { public static void main(String[] args) { TestLock2 testLock2 = new TestLock2(); new Thread(testLock2).start(); new Thread(testLock2).start(); new Thread(testLock2).start(); } } class TestLock2 implements Runnable{ int ticketNums = 10; //定義Lock鎖 private final ReentrantLock lock = new ReentrantLock(); @Override public void run() { while (true){ try { lock.lock(); if (ticketNums > 0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(ticketNums--); }else{ break; } } finally{ //解鎖 lock.unlock(); } } } }
synchronized 與Lock的對比
- Lock是顯式鎖(手動開啟和關閉鎖,別忘記關閉鎖)synchronized是隱式鎖,出了作用域自動釋放
- Lock只有程式碼塊鎖,synchronized有程式碼塊鎖和方法鎖
- 使用Lock鎖,JVM將花費較少的時間來排程執行緒,效能更好。並且具有更好的擴充套件性(提供更多的子類)
- 優先使用順序:
- Lock >同步程式碼塊(已經進入了方法體,分配了相應資源)>同步方法(在方法體之外)