一、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();
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/458656.html
標籤:其他
