package edu.rice.hj.example.comp322.labs.lab10; /* * Class SyncList implements a thread-safe sorted list data structure that supports contains(), add() and remove() methods. * * Thread safety is guaranteed by declaring each of the methods to be synchronized. */ public class SyncList extends ListSet { private final Entry head; public SyncList() { // Add sentinels to start and end this.head = new Entry(Integer.MIN_VALUE); this.head.next = new Entry(Integer.MAX_VALUE); } public synchronized boolean contains(final Object object) { Entry pred, curr; final int key = object.hashCode(); pred = this.head; curr = pred.next; while (curr.key < key) { pred = curr; curr = curr.next; } return (key == curr.key); } public synchronized int add(final Object object) { Entry pred, curr; final int key = object.hashCode(); pred = this.head; curr = pred.next; while (curr.key < key) { pred = curr; curr = curr.next; } if (key == curr.key) { // present return -1; } else { // not present final Entry entry = new Entry(object); entry.next = curr; pred.next = entry; return 1; } } public synchronized int remove(final Object object) { Entry pred, curr; final int key = object.hashCode(); pred = this.head; curr = pred.next; while (curr.key < key) { pred = curr; curr = curr.next; } if (key == curr.key) { // present pred.next = curr.next; return 1; } else { return -1; // not present } } // define list entry class private class Entry { Object object; int key; Entry next; Entry(final Object object) { // usual constructor this.object = object; this.key = object.hashCode(); } Entry(final int key) { // sentinel constructor this.object = null; this.key = key; } } }