Example Mutual Exclusion

class StackImpl {                                   // (1)
    private Object[] stackArray;
    private int topOfStack;

    public StackImpl(int capacity) {
        stackArray = new Object[capacity];
        topOfStack = -1;
    }

    public boolean push(Object element) {              // (2a) non-synchronized
//  public synchronized boolean push(Object element) { // (2b) synchronized
        if (isFull()) return false;
        ++topOfStack;
        try { Thread.sleep(1000); } catch (Exception ex) { } // (3) Sleep a little.
        stackArray[topOfStack] = element;
        return true;
    }

    public Object pop() {                           // (4a) non-synchronized
//  public synchronized Object pop() {              // (4b) synchronized
        if (isEmpty()) return null;
        Object obj = stackArray[topOfStack];
        stackArray[topOfStack] = null;
        try { Thread.sleep(1000); } catch (Exception ex) { } // (5) Sleep a little.
        topOfStack--;
        return obj;
    }
    public boolean isEmpty() { return topOfStack < 0; }
    public boolean isFull()  { return topOfStack >= stackArray.length - 1; }
}

public class Mutex {
    public static void main(String[] args) {

        final StackImpl stack = new StackImpl(20);  // (6) Shared by the threads.

        (new Thread("Pusher") {                     // (7) Thread no. 1
            public void run() {
                for(;;) {
                    System.out.println("Pushed: " +
                        stack.push(new Integer(2003)));
                }
            }
        }).start();

        (new Thread("Popper") {                     // (8) Thread no. 2
            public void run() {
                for(;;) {
                    System.out.println("Popped: " + stack.pop());
                }
            }
        }).start();

        System.out.println("Exit from main().");
    }
}
Possible output from the program:
Exit from main().
...
Pushed: true
Popped: 2003
Popped: 2003
Popped: null
...
Popped: null
java.lang.ArrayIndexOutOfBoundsException: -1
        at StackImpl.push(Mutex.java:15)
        at Mutex$1.run(Mutex.java:41)
Popped: null
Popped: null
...

No comments:

Post a Comment