Gregg Wonderly wrote:
On 12/18/2011 11:59 PM, Peter Firmstone wrote:
@Override
public boolean implies(Permission permission) {
if ( ! cl.isInstance(permission)) return false;
Permission [] p = perms.toArray(new Permission[0]);
//perms.size() may change
I not sure why you are using an empty Permission array here, and then
looping over it. Is this from some other testing?
Gregg
The collection is wrapped with a ConcurrentCollection's multi read,
single write wrapper, by passing a zero length array to the collection,
it obtains a read lock, the collection creates a new array, sized to
suit the underlying array, copy's the collection's contents into it and
returns, releasing the read lock, the operation is atomic.
If I did this, the call would acquire and release two read locks
consecutively, it wouldn't be atomic:
Permission[] p = perms.toArray(new Permission[perms.size()]);
It's there to avoid a cast:
Permission [] p = (Permission[]) perms.toArray();
Although not utilised here the Iterator returned by the
ConcurrentCollection wrapper has a private copy of the underlying
Collection, so it will never throw ConcurrentModificationException, so I
could use that instead, but using the array consumes less memory than
duplicating the collection.
Maybe I should change the comment to // Zero length array is replaced by
correct size array atomically.
Cheers,
Peter.