あなたはミューテックス(または相互排他ロック)について話していると思います。その場合は、組み込みロックを使用できます。Javaのこの種のロックはミューテックスとして機能します。つまり、最大で1つのスレッドがロックを所有できます。
synchronized (lock) {
// Access or modify shared state guarded by lock
}
ロックがモックオブジェクトである場合、ロックにのみ使用されます。
編集:
これがあなたのための実装です—値0を使用してロック解除状態を表し、1を使用してロック状態を表す非再入可能相互排除ロッククラス。
class Mutex implements Lock, java.io.Serializable {
// Our internal helper class
private static class Sync extends AbstractQueuedSynchronizer {
// Report whether in locked state
protected boolean isHeldExclusively() {
return getState() == 1;
}
// Acquire the lock if state is zero
public boolean tryAcquire(int acquires) {
assert acquires == 1; // Otherwise unused
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
// Release the lock by setting state to zero
protected boolean tryRelease(int releases) {
assert releases == 1; // Otherwise unused
if (getState() == 0) throw new IllegalMonitorStateException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
// Provide a Condition
Condition newCondition() { return new ConditionObject(); }
// Deserialize properly
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject();
setState(0); // reset to unlocked state
}
}
// The sync object does all the hard work. We just forward to it.
private final Sync sync = new Sync();
public void lock() { sync.acquire(1); }
public boolean tryLock() { return sync.tryAcquire(1); }
public void unlock() { sync.release(1); }
public Condition newCondition() { return sync.newCondition(); }
public boolean isLocked() { return sync.isHeldExclusively(); }
public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); }
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireNanos(1, unit.toNanos(timeout));
}
}
どこに電話すればよいかを知る必要がある場合はwait()
、notify()
をご覧くださいsun.misc.Unsafe#park()
。java.util.concurrent.locksパッケージ内で使用されます(AbstractQueuedSynchronizer <-LockSupport <-Unsafe)。
お役に立てれば。