1. 程式人生 > 其它 >Java多執行緒(五)-執行緒同步(Lock鎖)

Java多執行緒(五)-執行緒同步(Lock鎖)

六.執行緒同步(併發)

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>同步塊>同步方法