Java基礎——多線程(Lock鎖)


一、Lock鎖

雖然我們可以理解同步代碼塊和同步方法的鎖對象問題,但是我們並沒有直接看到在哪里上了鎖,在哪里釋放了鎖,為了更清晰的表達如何加鎖和釋放鎖,JDK5以后提供了一個新的鎖對象Lock

Lock實現提供比使用synchronized方法和語句更廣泛的鎖定操作

二、Lock中提供了獲得鎖和釋放鎖的方法

1.void lock():獲得鎖

2.void unlock();釋放鎖

Lock由於是接口,不能直接實例化,這里采用它的實現類ReentrantLock來實例化

三、ReentrantLock的構造方法

ReentrantLock():創建一個ReentrantLock的實例

例如:之前的賣票案例就可以這樣寫

public class SellTicket implements Runnable {
  //定義總張數
  private int tickets = 100;
  //定義Lock鎖,要用它的實現類完成
  Lock lock=new ReentrantLock();
  @Override
  public void run() {
      while (true) {
          //判斷車票是否大於0
          //加鎖
          lock.lock();
          if (tickets > 0) {
              System.out.println(Thread.currentThread().getName() + "賣出第" + tickets + "張車票");
              tickets--;
              //模仿出票
              try {
                  sleep(100);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }          
              }
          //釋放鎖
          lock.unlock();            
      }
  }
}

為了避免出現有時候出現異常不能及時釋放鎖的情況,我們用try...finally來操作一下

package Demo041901;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class SellTicket implements Runnable {
  //定義總張數
  private int tickets = 100;
  //定義Lock鎖,要用它的實現類完成
  Lock lock=new ReentrantLock();
  @Override
  public void run() {
      while (true) {
          //判斷車票是否大於0
          try {
              //加鎖
              lock.lock();
              if (tickets > 0) {
                  System.out.println(Thread.currentThread().getName() + "賣出第" + tickets + "張車票");
                  tickets--;
                  //模仿出票
                  try {
                      sleep(100);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }else {
                  break;
              }
          }finally {
              //釋放鎖
              lock.unlock();
          }
      }
  }
}
 


免責聲明!

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



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