(1)JDK5中Lock鎖的使用
雖然我們可以了解同步代碼塊和同步方法的鎖對象問題,但是我們并沒有直接看到在哪裡加上了鎖,在哪裡釋放了鎖,為了更清晰的表達如何加鎖和釋放鎖,JDK5以後提供了一個新的鎖對象Lock接口。
即:JDK5以後的針對線程的鎖定操作和釋放操作。
Lock實作提供了比使用synchronized方法和語句可獲得的更廣泛的鎖定操作。
(2)Lock接口的方法
void lock() 擷取鎖(加鎖)
void unlock() 釋放鎖
ReentrantLock類是Lock接口的實作類。
(3)示例代碼如下
1 package cn.itcast_01;
2 /*
3 * 雖然我們可以了解同步代碼塊和同步方法的鎖對象問題,但是我們并沒有直接看到在哪裡加上了鎖,在哪裡釋放了鎖,
4 * 為了更清晰的表達如何加鎖和釋放鎖,JDK5以後提供了一個新的鎖對象Lock接口。
5 *
6 * Lock接口的方法:
7 * void lock() 擷取鎖(加鎖)
8 * void unlock() 釋放鎖
9 *
10 * ReentrantLock類是Lock接口的實作類。
11 */
12 public class SellTicketDemo {
13 public static void main(String[] args) {
14 // 建立資源對象
15 SellTicket st = new SellTicket();
16
17 // 建立三個線程對象
18 Thread t1 = new Thread(st, "視窗1");
19 Thread t2 = new Thread(st, "視窗2");
20 Thread t3 = new Thread(st, "視窗3");
21
22 // 啟動線程
23 t1.start();
24 t2.start();
25 t3.start();
26 }
27 }
1 package cn.itcast_01;
2
3 import java.util.concurrent.locks.Lock;
4 import java.util.concurrent.locks.ReentrantLock;
5
6 public class SellTicket implements Runnable {
7 // 定義票
8 private int tickets = 100;
9
10 // 定義鎖對象
11 private Lock lock = new ReentrantLock(); // 多态
12
13 @Override
14 public void run() {
15 while (true) {
16 // 如果鎖裡面有異常發生,釋放鎖lock.unlock();就不會被執行,
17 // 為了保證釋放鎖lock.unlock();被執行,使用try...finally...
18 // 将lock.unlock();放在finally裡面。
19 try {
20 // 擷取鎖(加鎖)
21 lock.lock();
22 if (tickets > 0) {
23 try {
24 Thread.sleep(100);
25 } catch (InterruptedException e) {
26 e.printStackTrace();
27 }
28 System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "張票");
29 }
30 } finally {
31 // 釋放鎖
32 lock.unlock();
33 }
34 }
35 }
36
37 }
我的GitHub位址:
https://github.com/heizemingjun我的部落格園位址:
http://www.cnblogs.com/chenmingjun我的螞蟻筆記部落格位址:
http://blog.leanote.com/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】