(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 }