java - Volatile and ArrayBlockingQueue and perhaps other concurrent objects -
i understand (or @ least think do;) ) principle behind volatile keyword. when looking concurrenthashmap source, can see nodes , values declared volatile, makes sense because value can written/read more 1 thread:
static class node<k,v> implements map.entry<k,v> { final int hash; final k key; volatile v val; volatile node<k,v> next; ... } however, looking arrayblockingqueue source, it's plain array being updated/read multiple threads:
private void enqueue(e x) { // assert lock.getholdcount() == 1; // assert items[putindex] == null; final object[] items = this.items; items[putindex] = x; if (++putindex == items.length) putindex = 0; count++; notempty.signal(); } how guaranteed value inserted items[putindex] visible thread, providing element inside array not volatile (i know declaring array doesnt have effect anyhow on elements themselves) ? couldn't thread hold cached copy of array?
thanks
notice enqueue private. calls (offer(e), offer(e, long, timeunit), put(e)). notice every 1 of looks like:
public void put(e e) throws interruptedexception { checknotnull(e); final reentrantlock lock = this.lock; lock.lockinterruptibly(); try { // stuff. enqueue(e); } { lock.unlock(); } } so can conclude every call enqueue protected lock.lock() ... lock.unlock() don't need volatile because lock.lock/unlock memory barrier.
Comments
Post a Comment