The Enumeration API is not suitable for multi-threaded use because there is a window for change between the hasMoreElements call and the subsequent nextElement call.<br><br>In almost all cases the Enumeration is consumed in the same thread in which it is produced.<div>
<br></div><div>The strange corner case that you envision is: one thread creates an Enumeration and hands it to another thread.  The other thread calls hasNextElement and may see a stale value for elementCount, causing it to end too early (not calling nextElement) or to fail unexpectedly when it does call nextElement.</div>
<div><br></div><div>With this scenario in mind, using "synchronized" in hasMoreElements is more correct, though in practice I doubt it will make any difference.</div><div><br></div><div>Joe</div><div><br><div class="gmail_quote">
On Thu, Jul 19, 2012 at 8:12 AM, Praveen Kumar Jha wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br><br>Please help me in understanding the thread-safety of hasMoreElements() of Vector from visibility point of view. The hasMoreElements()<br>
accesses the 'elementCount' field without synchronizing over 'Vector.this', like it is done in nextElement() method.<br>
<br>public Enumeration<E> elements() {<br>
    return new Enumeration<E>() {<br>
        int count = 0;<br>
<br>
        public boolean hasMoreElements() {<br>
        return count < elementCount;<br>
        }<br>
<br>
        public E nextElement() {<br>
        synchronized (Vector.this) {<br>
            if (count < elementCount) {<br>
            return (E)elementData[count++];<br>
            }<br>
        }<br>
        throw new NoSuchElementException("Vector Enumeration");<br>
        }<br>
    };<br>
    }<br><br>This might cause a thread to see stale value of 'elementCount' and thus hasMoreElements() might incorrectly return true or false. <br>Javadoc of neither Enumeration nor elements() of Vector says anything about thread-safety.<br>

<br>Regards,<br>Praveen<br><br></blockquote></div></div>