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 }
Copyright ©2018-2019
【转载文章务必保留出处和署名,谢谢!】
【转载文章务必保留出处和署名,谢谢!】