天天看點

JDK5中Lock鎖的使用

(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/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】