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

时间:2020-12-10 21:35:23

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

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

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

注意:Lock是个接口。

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

 public class SellTicket implements Runnable {//别忘了这个继承接口
// 定义100张票
private int tickets = 100; // 定义锁对象
private Lock lock = new ReentrantLock(); public void run() { //这里使用了不带catch的try..finally的格式,中间的代码出现问题了,就直接执行finally while (true) {
try { // 加锁,在会出现错误的代码前加锁,跟之前的一样
lock.lock(); if (tickets > 0) { // 休眠0.1秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "张票");
}
} finally {
// 解锁 中间代码一有异常,就解锁,
lock.unlock();
}
}
}
}