為何ArrayBlockingQueue中的ReentranLock對象無需實例化?
public?class?ArrayBlockingQueue<E>?extends?AbstractQueue<E>????????
implements?BlockingQueue<E>,?java.io.Serializable?{
????final?Object[]?items;??????
????int?takeIndex;??????
????int?putIndex;???????
????int?count;????????
????final?ReentrantLock?lock;????/**notEmpty條件對象,用于通知take方法隊列已有元素,可執行獲取操作?*/
????
????private?final?Condition?notEmpty;????????
????private?final?Condition?notFull;??????????迭代器?????*/????
????transient?Itrs?itrs?=?null;
????
????public?void?put(E?e)?throws?InterruptedException?{?????
????checkNotNull(e);???????????
????final?ReentrantLock?lock?=?this.lock;??//???????????????
????lock.lockInterruptibly();
????try?{????????????????????
?????????while?(count?==?items.length)??????????????//將當前調用線程掛起,添加到notFull條件隊列中等待喚醒??????????????
?????????notFull.await();??????????
?????????enqueue(e);//如果隊列沒有滿直接添加。。??????}?finally?{??????????
???????????lock.unlock();??????
???????????????}??
????????????}
?????????}為甚么類的屬性里沒有ReentrantLock lock = new ReentrantLock();
卻可以在put()中直接指定ReentrantLock lock=this.lock;?
2018-09-10
/** ?*?Creates?an?{@code?ArrayBlockingQueue}?with?the?given?(fixed) ?*?capacity?and?the?specified?access?policy. ?* ?*?@param?capacity?the?capacity?of?this?queue ?*?@param?fair?if?{@code?true}?then?queue?accesses?for?threads?blocked ?*????????on?insertion?or?removal,?are?processed?in?FIFO?order; ?*????????if?{@code?false}?the?access?order?is?unspecified. ?*?@throws?IllegalArgumentException?if?{@code?capacity?<?1} ?*/ public?ArrayBlockingQueue(int?capacity,?boolean?fair)?{ ????if?(capacity?<=?0) ????????throw?new?IllegalArgumentException(); ????this.items?=?new?Object[capacity]; ????lock?=?new?ReentrantLock(fair); ????notEmpty?=?lock.newCondition(); ????notFull?=??lock.newCondition(); }構造方法里面初始化了lock對象