雖然我們可以理解同步代碼塊和同步方法的鎖對象問題,但是我們並沒有直接看到在哪里加上了鎖,在哪里釋放了鎖.
為了更清晰的表達如何加鎖和釋放鎖,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(); } }