Lock
同步鎖使用的弊端:當線程任務(wù)中出現(xiàn)了多個同步(多個鎖)時,如果同步中嵌套了其他的同步榕订。這時容易引發(fā)一種現(xiàn)象:程序出現(xiàn)無限等待样屠,這種現(xiàn)象我們稱為死鎖
查閱API,查閱Lock接口描述沈矿,Lock 實現(xiàn)提供了比使用synchronized 方法和語句可獲得的更廣泛的鎖定操作。
Lock接口中的常用方法
Lock提供了一個更加面對對象的鎖咬腋,在該鎖中提供了更多的操作鎖的功能羹膳。
我們使用Lock接口,以及其中的lock()方法和unlock()方法替代同步根竿,對電影院賣票案例中Ticket類進行如下代碼修改:
public
class Ticket implements Runnable {
??? //共100票
??? int ticket = 100;
??? //創(chuàng)建Lock鎖對象
??? Lock ck = new ReentrantLock();
??? @Override
??? public void run() {
??? ??? //模擬賣票
??? ??? while(true){
??? ??? ??? //synchronized (lock){
??? ??? ??? ck.lock();
??? ??? ??? ??? if (ticket > 0) {
??? ??? ??? ??? ??? //模擬選坐的操作
??? ??? ??? ??? ??? try {
??? ??? ??? ??? ??? ??? Thread.sleep(10);
??? ??? ??? ??? ??? } catch (InterruptedException e) {
??? ??? ??? ??? ??? ??? e.printStackTrace();
??? ??? ??? ??? ??? }
??? ??? ??? ??? ??? System.out.println(Thread.currentThread().getName()+"正在賣票:" + ticket--);
??? ??? ??? ??? }
??? ??? ??? ck.unlock();
??? ??? ??? //}
??? ??? }
??? }