在之前解决线程安全的过程中,虽然我们可以理解同步代码块和同步方法的锁对象问题,
但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,
为了更清晰的表达如何加锁和释放锁,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 }