01: /*
02: * Copyright 1994-2005 Sun Microsystems, Inc. All Rights Reserved.
03: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
04: *
05: * This code is free software; you can redistribute it and/or modify it
06: * under the terms of the GNU General Public License version 2 only, as
07: * published by the Free Software Foundation. Sun designates this
08: * particular file as subject to the "Classpath" exception as provided
09: * by Sun in the LICENSE file that accompanied this code.
10: *
11: * This code is distributed in the hope that it will be useful, but WITHOUT
12: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * version 2 for more details (a copy is included in the LICENSE file that
15: * accompanied this code).
16: *
17: * You should have received a copy of the GNU General Public License version
18: * 2 along with this work; if not, write to the Free Software Foundation,
19: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20: *
21: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22: * CA 95054 USA or visit www.sun.com if you need additional information or
23: * have any questions.
24: */
25:
26: package sun.misc;
27:
28: /**
29: * The Lock class provides a simple, useful interface to a lock.
30: * Unlike monitors which synchronize access to an object, locks
31: * synchronize access to an arbitrary set of resources (objects,
32: * methods, variables, etc.). <p>
33: *
34: * The programmer using locks must be responsible for clearly defining
35: * the semantics of their use and should handle deadlock avoidance in
36: * the face of exceptions. <p>
37: *
38: * For example, if you want to protect a set of method invocations with
39: * a lock, and one of the methods may throw an exception, you must be
40: * prepared to release the lock similarly to the following example:
41: * <pre>
42: * class SomeClass {
43: * Lock myLock = new Lock();
44:
45: * void someMethod() {
46: * myLock.lock();
47: * try {
48: * StartOperation();
49: * ContinueOperation();
50: * EndOperation();
51: * } finally {
52: * myLock.unlock();
53: * }
54: * }
55: * }
56: * </pre>
57: *
58: * @version 1.28, 05/05/07
59: * @author Peter King
60: */
61: public class Lock {
62: private boolean locked = false;
63:
64: /**
65: * Create a lock, which is initially not locked.
66: */
67: public Lock() {
68: }
69:
70: /**
71: * Acquire the lock. If someone else has the lock, wait until it
72: * has been freed, and then try to acquire it again. This method
73: * will not return until the lock has been acquired.
74: *
75: * @exception java.lang.InterruptedException if any thread has
76: * interrupted this thread.
77: */
78: public final synchronized void lock() throws InterruptedException {
79: while (locked) {
80: wait();
81: }
82: locked = true;
83: }
84:
85: /**
86: * Release the lock. If someone else is waiting for the lock, the
87: * will be notitified so they can try to acquire the lock again.
88: */
89: public final synchronized void unlock() {
90: locked = false;
91: notifyAll();
92: }
93: }
|