java 22 - 14 JDK1.5以后的Lock锁

在之前解决线程安全的过程中,虽然我们可以理解同步代码块和同步方法的锁对象问题,

但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,

为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock

注意:Lock是个接口。

2个常用方法:
   void lock(): 获取锁。
   void unlock():释放锁。
 ReentrantLock是Lock的实现类。

 

 1 public class SellTicket implements Runnable {//别忘了这个继承接口
 2     // 定义100张票
 3     private int tickets = 100;
 4 
 5     // 定义锁对象
 6     private Lock lock = new ReentrantLock();
 7 
 8     public void run() {
 9 
10         //这里使用了不带catch的try..finally的格式,中间的代码出现问题了,就直接执行finally
11 
12         while (true) {
13             try {
14                 
15                 // 加锁,在会出现错误的代码前加锁,跟之前的一样
16                 lock.lock();
17                 
18                 if (tickets > 0) {
19                                         
20                     // 休眠0.1秒
21                     try {
22                         Thread.sleep(100);
23                     } catch (InterruptedException e) {
24                         // TODO Auto-generated catch block
25                         e.printStackTrace();
26                     }
27 
28                     System.out.println(Thread.currentThread().getName()
29                             + "正在出售第" + (tickets--) + "张票");
30                 }
31             } finally {
32                 // 解锁  中间代码一有异常,就解锁,
33                 lock.unlock();
34             }
35         }
36     }
37 }

 

posted @ 2016-10-10 18:32  卡拉瓦  阅读(957)  评论(0编辑  收藏  举报