Java多執行緒(五)-執行緒同步(Lock鎖)
阿新 • • 發佈:2021-10-02
六.執行緒同步(併發)
Lock鎖:
通過顯式定義鎖實現同步。
java.util.concurrent,locks.lock介面是控制多個執行緒對共享資源進行訪問的工具。鎖可以對共享資源的獨佔訪問,每次只能有一個執行緒對lock物件加索,執行緒開始訪問共享資源前先獲得lock物件。
ReentrantLock類實現了Lock,擁有於synchronized相同的併發性和記憶體語義,比較常用。
class A{ private final ReentrantLock lock = new ReentrantLock(); public void m() { try { lock.lock(); //保證執行緒安全的程式碼 }finally { lock.unlock(); } } }
點選檢視案例
public class Lock { public static void main(String[] args) { BuyTickett buyTicket = new BuyTickett(); new Thread(buyTicket,"a").start(); new Thread(buyTicket,"b").start(); new Thread(buyTicket,"c").start(); } } class BuyTickett implements Runnable{ private int ticketNum = 10; boolean flag = true; private final ReentrantLock lock = new ReentrantLock(); @Override public void run() { while (flag){ try { lock.lock(); try { buy(); } catch (InterruptedException e) { e.printStackTrace(); } }finally { lock.unlock(); } } } private void buy() throws InterruptedException { if (ticketNum <= 0){ flag = false; return; } Thread.sleep(100); System.out.println(Thread.currentThread().getName()+"獲得了第"+ticketNum--+"張票"); } }
執行結果
b獲得了第10張票
b獲得了第9張票
c獲得了第8張票
c獲得了第7張票
c獲得了第6張票
c獲得了第5張票
c獲得了第4張票
c獲得了第3張票
a獲得了第2張票
a獲得了第1張票
Lock鎖與synchronized對比:
- lock是顯式鎖,需手動開啟關閉,synchronized隱式鎖,出作用域自動關閉
- Lock鎖效能更好
- (優先順序)使用順序:Lock>同步塊>同步方法