虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁.
为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock,而ReentrantLock是Lock的实现类.
package com.test; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int tickets = 100; //定义锁对象 private Lock lock = new ReentrantLock(); @Override public void run() { while (true) { try { /**加锁*/ lock.lock(); if (tickets > 0) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票"); tickets--; } } finally { /**无论代码执行是否异常,都会到这来释放锁*/ lock.unlock(); } } } }
package com.test; public class SellTicketTest { public static void main(String[] args){ SellTicket sellTicket = new SellTicket(); Thread t1 = new Thread(sellTicket,"窗口一"); Thread t2 = new Thread(sellTicket,"窗口二"); Thread t3 = new Thread(sellTicket,"窗口三"); t1.start(); t2.start(); t3.start(); } }