Fixed warning in AbstractConcurrentSet

This commit is contained in:
nathan 2015-02-04 02:35:36 +01:00
parent ff4dd6271f
commit e0b9d8addb

View File

@ -29,24 +29,25 @@ public abstract class AbstractConcurrentSet<T> implements IConcurrentSet<T> {
@Override @Override
public void add(T element) { public void add(T element) {
if (element == null) return; if (element == null) {
Lock writeLock = lock.writeLock(); return;
}
Lock writeLock = this.lock.writeLock();
writeLock.lock(); writeLock.lock();
if (element == null || entries.containsKey(element)) { if (this.entries.containsKey(element)) {
writeLock.unlock();
} else { } else {
insert(element); insert(element);
writeLock.unlock();
} }
writeLock.unlock();
} }
@Override @Override
public boolean contains(T element) { public boolean contains(T element) {
Lock readLock = lock.readLock(); Lock readLock = this.lock.readLock();
ISetEntry<T> entry; ISetEntry<T> entry;
try { try {
readLock.lock(); readLock.lock();
entry = entries.get(element); entry = this.entries.get(element);
} finally { } finally {
readLock.unlock(); readLock.unlock();
@ -55,20 +56,20 @@ public abstract class AbstractConcurrentSet<T> implements IConcurrentSet<T> {
} }
private void insert(T element) { private void insert(T element) {
if (!entries.containsKey(element)) { if (!this.entries.containsKey(element)) {
head = createEntry(element, head); this.head = createEntry(element, this.head);
entries.put(element, head); this.entries.put(element, this.head);
} }
} }
@Override @Override
public int size() { public int size() {
return entries.size(); return this.entries.size();
} }
@Override @Override
public void addAll(Iterable<T> elements) { public void addAll(Iterable<T> elements) {
Lock writeLock = lock.writeLock(); Lock writeLock = this.lock.writeLock();
try { try {
writeLock.lock(); writeLock.lock();
for (T element : elements) { for (T element : elements) {
@ -87,21 +88,21 @@ public abstract class AbstractConcurrentSet<T> implements IConcurrentSet<T> {
// return quickly // return quickly
return false; return false;
} else { } else {
Lock writeLock = lock.writeLock(); Lock writeLock = this.lock.writeLock();
try { try {
writeLock.lock(); writeLock.lock();
ISetEntry<T> listelement = entries.get(element); ISetEntry<T> listelement = this.entries.get(element);
if (listelement == null) { if (listelement == null) {
return false; //removed by other thread in the meantime return false; //removed by other thread in the meantime
} }
if (listelement != head) { if (listelement != this.head) {
listelement.remove(); listelement.remove();
} else { } else {
// if it was second, now it's first // if it was second, now it's first
head = head.next(); this.head = this.head.next();
//oldHead.clear(); // optimize for GC not possible because of potentially running iterators //oldHead.clear(); // optimize for GC not possible because of potentially running iterators
} }
entries.remove(element); this.entries.remove(element);
} finally { } finally {
writeLock.unlock(); writeLock.unlock();
} }
@ -127,13 +128,13 @@ public abstract class AbstractConcurrentSet<T> implements IConcurrentSet<T> {
// not thread-safe! must be synchronized in enclosing context // not thread-safe! must be synchronized in enclosing context
@Override @Override
public void remove() { public void remove() {
if (predecessor != null) { if (this.predecessor != null) {
predecessor.next = next; this.predecessor.next = this.next;
if (next != null) { if (this.next != null) {
next.predecessor = predecessor; this.next.predecessor = this.predecessor;
} }
} else if (next != null) { } else if (this.next != null) {
next.predecessor = null; this.next.predecessor = null;
} }
// can not nullify references to help GC since running iterators might not see the entire set // can not nullify references to help GC since running iterators might not see the entire set
// if this element is their current element // if this element is their current element
@ -143,12 +144,12 @@ public abstract class AbstractConcurrentSet<T> implements IConcurrentSet<T> {
@Override @Override
public Entry<T> next() { public Entry<T> next() {
return next; return this.next;
} }
@Override @Override
public void clear() { public void clear() {
next = null; this.next = null;
} }
} }
} }