1/* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. 7 * 8 * This code is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 * version 2 for more details (a copy is included in the LICENSE file that 12 * accompanied this code). 13 * 14 * You should have received a copy of the GNU General Public License version 15 * 2 along with this work; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 19 * or visit www.oracle.com if you need additional information or have any 20 * questions. 21 */ 22 23/* 24 * This file is available under and governed by the GNU General Public 25 * License version 2 only, as published by the Free Software Foundation. 26 * However, the following notice accompanied the original version of this 27 * file: 28 * 29 * Written by Doug Lea with assistance from members of JCP JSR-166 30 * Expert Group and released to the public domain, as explained at 31 * http://creativecommons.org/publicdomain/zero/1.0/ 32 */ 33 34import java.util.concurrent.TimeUnit; 35import java.util.concurrent.locks.AbstractQueuedSynchronizer; 36import java.util.concurrent.locks.Condition; 37import java.util.concurrent.locks.Lock; 38import java.io.IOException; 39import java.io.ObjectInputStream; 40 41/** 42 * A sample user extension of AbstractQueuedSynchronizer. 43 */ 44public class Mutex implements Lock, java.io.Serializable { 45 private static class Sync extends AbstractQueuedSynchronizer { 46 public boolean isHeldExclusively() { return getState() == 1; } 47 48 public boolean tryAcquire(int acquires) { 49 assert acquires == 1; // Does not use multiple acquires 50 return compareAndSetState(0, 1); 51 } 52 53 public boolean tryRelease(int releases) { 54 setState(0); 55 return true; 56 } 57 58 Condition newCondition() { return new ConditionObject(); } 59 60 private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { 61 s.defaultReadObject(); 62 setState(0); // reset to unlocked state 63 } 64 } 65 66 private final Sync sync = new Sync(); 67 public void lock() { 68 sync.acquire(1); 69 } 70 public boolean tryLock() { 71 return sync.tryAcquire(1); 72 } 73 public void lockInterruptibly() throws InterruptedException { 74 sync.acquireInterruptibly(1); 75 } 76 public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException { 77 return sync.tryAcquireNanos(1, unit.toNanos(timeout)); 78 } 79 public void unlock() { sync.release(1); } 80 public Condition newCondition() { return sync.newCondition(); } 81 public boolean isLocked() { return sync.isHeldExclusively(); } 82 public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); } 83} 84