public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements Serializable
intå€ã«äŸåãã倧åã®çš®é¡ã®ã·ã³ã¯ããã€ã¶ã®æçšãªåºç€ãšããŠèšèšãããŠããŸãã ãµãã¯ã©ã¹ã¯ããã®ç¶æ
ã倿Žããprotectedã¡ãœãããå®çŸ©ããå¿
èŠãããããã®ã¡ãœããã¯ååŸãŸãã¯è§£æŸäžã®ãªããžã§ã¯ãã䜿çšããŠç¶æ
ã®æå³ãå®çŸ©ããŸãã ããããæå®ããããšããã®ã¯ã©ã¹å
ã®ã»ãã®ã¡ãœããã¯ãã¹ãŠã®ãã¥ãŒããã³ãããã¯æ©æ§ã皌åãããŸãã ãµãã¯ã©ã¹ã¯ãã»ãã®ç¶æ
ãã£ãŒã«ããç¶æã§ããŸãããåæã«é¢ãã远跡ãè¡ããã®ã¯getState()ãsetState(int)ãããã³compareAndSetState(int, int)ã¡ãœããã䜿çšããŠæäœãããååçã«æŽæ°ãããintå€ã ãã§ãã
ãµãã¯ã©ã¹ã¯ãpublicã§ã¯ãªãå
éšãã«ããŒã»ã¯ã©ã¹ãšããŠå®çŸ©ããå¿
èŠããããŸããããã¯ããããå²ãã¯ã©ã¹ã®åæããããã£ã®å®è£
ã«äœ¿çšãããŸãã AbstractQueuedSynchronizerã¯ã©ã¹ã¯ãåæã€ã³ã¿ãã§ãŒã¹ãäžåå®è£
ããŸããã ãããã«ãå
·è±¡ããã¯ããã³é¢é£ããã·ã³ã¯ããã€ã¶ã«ããé©å®åŒã³åºããŠpublicã¡ãœãããå®è£
ã§ããacquireInterruptibly(int)ãªã©ã®ã¡ãœãããå®çŸ©ããŸãã
ãã®ã¯ã©ã¹ã¯ãããã©ã«ãã®æä»ã¢ãŒããšå
±æã¢ãŒãã®ã©ã¡ãããŸãã¯äž¡æ¹ããµããŒãããŸãã æä»ã¢ãŒãã§ååŸããããšãã»ãã®ã¹ã¬ãããååŸã詊ã¿ãŠãæåããŸããã å
±æã¢ãŒãã§ã¯ãè€æ°ã®ã¹ã¬ããã«ããååŸãå¯èœã§ã(ãã ããå¿
ãååŸãæåããå¿
èŠãããããã§ã¯ãªã)ã ãã®ã¯ã©ã¹ã¯ãå
±æã¢ãŒãã®ååŸãæåããå ŽåãåŸ
æ©äžã®æ¬¡ã®ã¹ã¬ãã(ååšããå Žå)ãååŸå¯èœãã©ãããå€å¥ããå¿
èŠããããšããæ©æ§çãªæå³ãé€ãããããã®éãããèªèãããŸããã å¥ã®ã¢ãŒãã§åŸ
æ©äžã®ã¹ã¬ããã¯ãåãFIFOãã¥ãŒãå
±æããŸãã éåžžãå®è£
ãµãã¯ã©ã¹ã¯ãããã®ã¢ãŒãã®1ã€ã ãããµããŒãããŸãããReadWriteLockãªã©ã§ã¯äž¡æ¹ãæ©èœããããšãå¯èœã§ãã æä»ã¢ãŒããŸãã¯å
±æã¢ãŒãã®ã¿ããµããŒããããµãã¯ã©ã¹ã¯ã䜿çšããªãã¢ãŒãããµããŒãããã¡ãœãããå®çŸ©ããå¿
èŠã¯ãããŸããã
ãã®ã¯ã©ã¹ã¯ãæä»ã¢ãŒãããµããŒããããµãã¯ã©ã¹ãConditionå®è£
ãšããŠäœ¿çšã§ãããå
¥ãåã«ãããAbstractQueuedSynchronizer.ConditionObjectã¯ã©ã¹ãå®çŸ©ããŸããããã«é¢ããŠãisHeldExclusively()ã¡ãœããã¯çŸåšã®ã¹ã¬ããã«é¢ããŠåæãæä»çã«ä¿æããããã©ãããå ±åããçŸåšã®getState()å€ã䜿çšããŠåŒã³åºãããrelease(int)ã¡ãœããã¯ãã®ãªããžã§ã¯ããå®å
šã«è§£æŸããããã«acquire(int)ã¯ããã®ä¿åãããç¶æ
å€ãæå®ããããšããã®ãªããžã§ã¯ãã以åã®ååŸãããç¶æ
ã«æçµçã«åŸ©å
ããŸãã ãã以å€ã§ã¯ãã©ã®AbstractQueuedSynchronizerã¡ãœããããã®ãããªç¶æ
ãäœæããªãããããã®å¶çŽãæºããããšãã§ããªãå Žåã¯äœ¿çšããªãã§ãã ããã AbstractQueuedSynchronizer.ConditionObjectã®åäœã¯ãã¡ããããã®ã·ã³ã¯ããã€ã¶å®è£
ã®ã»ãã³ãã£ãã¯ã¹ã«äŸåããŸãã
ãã®ã¯ã©ã¹ã¯ãå
éšãã¥ãŒã®æ€èšŒãèšæž¬ãããã³ç£èŠçšã¡ãœãããããã³ç¶æ
ãªããžã§ã¯ãçšã®é¡äŒŒã¡ãœãããæäŸããŸãã ãããã¯ãå¿
èŠã«å¿ããŠããã®åææ©æ§ã®ããã®AbstractQueuedSynchronizerã䜿çšããŠã¯ã©ã¹å
ã«ãšã¯ã¹ããŒãã§ããŸãã
ãã®ã¯ã©ã¹ãçŽååãããšãåºã«ãªãååæŽæ°ã®ä¿å®ç¶æ
ã ããæ ŒçŽããããããçŽåå埩å
ããããªããžã§ã¯ãã¯ç©ºã®ã¹ã¬ããã»ãã¥ãŒãä¿æããŸãã çŽååå¯èœæ§ãå¿
èŠãªæšæºçãªãµãã¯ã©ã¹ã¯ãçŽåå埩å
æã«ãããæ¢ç¥ã®åæç¶æ
ã«åŸ©å
ããreadObjectã¡ãœãããå®çŸ©ããŸãã
ãã®ã¯ã©ã¹ãã·ã³ã¯ããã€ã¶ã®åºç€ãšããŠäœ¿çšããã«ã¯ãå¿
èŠã«å¿ããŠãgetState()ãsetState(int)ããŸãã¯compareAndSetState(int, int)ã䜿çšããŠåæç¶æ
ãæ€æ»ãŸãã¯å€æŽããããšã«ãã£ãŠæ¬¡ã®ã¡ãœãããåå®çŸ©ããŸãã
UnsupportedOperationExceptionãã¹ããŒããŸãã ãããã®ã¡ãœããã®å®è£
ã¯ãå
éšãã¹ã¬ããã»ã»ãŒãã§ãªããã°ãªããããŸããéåžžã¯çããã€ããããã³ã°ãªãã§ããå¿
èŠããããŸãã ãããã®ã¡ãœããã®å®çŸ©ã¯ããã®ã¯ã©ã¹ã®ãµããŒããããå¯äžã®äœ¿ç𿹿³ã§ãã ã»ãã®ã¡ãœããã¯ãã¹ãŠãåå¥ã«å€æŽããããšã¯ã§ããªããããfinalãšå®£èšãããŸãã
ãŸããAbstractOwnableSynchronizerããç¶æ¿ãããã¡ãœããããæä»çãªã·ã³ã¯ããã€ã¶ãææããã¹ã¬ããã远跡ãããšãã«äŸ¿å©ã§ãã ããã¯ãä¿æããã¹ã¬ããã倿ããã®ã«åœ¹ç«ã€ç£èŠããã³èšºæã®ããŒã«ãæå¹ã«ãªãããããããã䜿çšããããšããèŠãããŸãã
ãã®ã¯ã©ã¹ã¯å éšã®FIFOãã¥ãŒã«åºã¥ããšã¯ãããèªåçã«FIFOååŸããªã·ãŒãé©çšãããããã§ã¯ãããŸããã æä»çãªåæã®ã³ã¢ã¯ã次ã®åœ¢åŒã«ãªããŸãã
Acquire:
while (!tryAcquire(arg)) {
enqueue thread if it is not already queued;
possibly block current thread;
}
Release:
if (tryRelease(arg))
unblock the first queued thread;
(å
±æã¢ãŒãã䌌ãŠããããã«ã¹ã±ãŒãä¿¡å·ãé¢ä¿ããå Žåããã)
ååŸã§ã®ãã§ãã¯ã¯ãã¥ãŒã«å
¥ããããåã«åŒã³åºããããããæ°ããååŸããã¹ã¬ããã¯ããããã¯ãããŠãã¥ãŒã«å
¥ããããä»ã®ã¹ã¬ããããå
ã«ããŒãžã§ããŸãã ãã ããå¿
èŠã§ããã°ãtryAcquireãtryAcquireSharedãå®çŸ©ããŠã1ã€ä»¥äžã®æ€æ»ã¡ãœãããå
éšçã«åŒã³åºããå
¬å¹³ãªFIFOååŸé åºãæäŸããããšã«ãã£ãŠããŒãžãç¡å¹ã«ããããã«ã§ããŸãã ç¹ã«ãã»ãšãã©ã®å
¬å¹³ãªã·ã³ã¯ããã€ã¶ã¯ãhasQueuedPredecessors() (å
¬å¹³ãªã·ã³ã¯ããã€ã¶ã§äœ¿çšãããããã«ç¹å¥ã«èšèšãããã¡ãœãã)ãtrueãè¿ãå Žåã¯falseãè¿ãããã«tryAcquireãå®çŸ©ã§ããŸãã ãã®ä»ã®ããªãšãŒã·ã§ã³ãå¯èœã§ãã
éåžžãã¹ã«ãŒããããšã¹ã±ãŒã©ããªãã£ã¯ãããã©ã«ãã®ããŒãž(è²ªæ¬²ãæŸæ£ãè·éåé¿ãšãåŒã°ãã)ã¹ãã©ããžã®æäžäœã«äœçœ®ããŸãã ãããåãããªããæ¯æžããªãããšã¯ä¿èšŒãããŸããããå
ã«ãã¥ãŒã«å
¥ããããã¹ã¬ããã¯ãããšã§ãã¥ãŒã«å
¥ããããã¹ã¬ããããåã«åç«¶åãèš±å¯ãããååç«¶åã¯çä¿¡ããã¹ã¬ããã«å¯ŸããŠæåããå
¬å¹³ãªæ©äŒãä¿æããŸãã ãŸããååŸã¯ãéåžžã®æå³ã§ã¯ãã¹ãã³ãããŸããããããããã³ã°åã«ä»ã®èšç®ã«æ¿å
¥ãããtryAcquireã®è€æ°ã®åŒåºããå®è¡å¯èœã§ãã ããã«ãããæä»çãªåæãçæçã«ä¿æãããã ãã®å Žåãã¹ãã³ã®æ©æµã®å€ãã享åã§ããŸããããã«ãæä»çãªåæãä¿æãããªãå Žåã«ã¯ã»ãšãã©è² æ
ãªãã§ããã®æ©æµã享åã§ããŸãã å¿
èŠã«å¿ããŠãååŸã¡ãœãããåŒã³åºãåã«ãæ©éããã§ãã¯ãè¡ãããšã§ããããè£åŒ·ã§ããŸããããšãã°ãhasContended()ãhasQueuedThreads()ãäºåã«ãã§ãã¯ããã·ã³ã¯ããã€ã¶ãç«¶åããå¯èœæ§ãå°ãªãå Žåã®ã¿ååŸã¡ãœãããåŒã³åºãããã«ããŸãã
ãã®ã¯ã©ã¹ã¯ã䜿çšç¯å²ãintç¶æ
ããã©ã¡ãŒã¿ã®ååŸãšè§£æŸãããã³å
éšFIFOåŸ
æ©ãã¥ãŒã«äŸåå¯èœãªã·ã³ã¯ããã€ã¶ã«éå®ããããšã«ãããå¹ççã§æ¡åŒµæ§ã®é«ãåæåºç€ã®äžéšãæäŸããŸãã ããã§ãååã§ã¯ãªãå Žåãatomicã¯ã©ã¹ãç¬èªã®ã«ã¹ã¿ã Queueã¯ã©ã¹ãããã³LockSupportãããã¯ã»ãµããŒãã䜿çšããŠãã·ã³ã¯ããã€ã¶ãäœã¬ãã«ããæ§ç¯ã§ããŸãã
次ã«ãå€ãŒãã䜿çšããŠããã¯è§£é€ç¶æ ããã³ããã¯ç¶æ ã衚ãåå ¥äžå¯èœãªçžäºæä»ããã¯ã»ã¯ã©ã¹ã瀺ããŸãã åå ¥äžå¯èœãªããã¯ã§ã¯ãå³å¯ã«ã¯çŸåšã®ææè ã¹ã¬ãããèšé²ããå¿ èŠã¯ãããŸãããããã®ã¯ã©ã¹ã§ã¯äœ¿çšç¶æ³ãç°¡åã«ç£èŠã§ããããã«ãèšé²ãè¡ããŸãã ããã¯ãç¶æ ã®ãµããŒãããã³ããããã®èšæž¬ã¡ãœããã®å ¬éãè¡ããŸãã
class Mutex implements Lock, java.io.Serializable {
// Our internal helper class
private static class Sync extends AbstractQueuedSynchronizer {
// Reports whether in locked state
protected boolean isHeldExclusively() {
return getState() == 1;
}
// Acquires 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;
}
// Releases 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;
}
// Provides a Condition
Condition newCondition() { return new ConditionObject(); }
// Deserializes 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));
}
}
次ã«ãèµ·åã«åäžã®signalãå¿
èŠãšããããšãé€ããCountDownLatchã¯ã©ã¹ã«é¡äŒŒããã©ããã»ã¯ã©ã¹ã瀺ããŸãã ã©ããã¯éæä»çã§ãããããsharedååŸããã³è§£æŸã¡ãœããã䜿çšããŸãã
class BooleanLatch {
private static class Sync extends AbstractQueuedSynchronizer {
boolean isSignalled() { return getState() != 0; }
protected int tryAcquireShared(int ignore) {
return isSignalled() ? 1 : -1;
}
protected boolean tryReleaseShared(int ignore) {
setState(1);
return true;
}
}
private final Sync sync = new Sync();
public boolean isSignalled() { return sync.isSignalled(); }
public void signal() { sync.releaseShared(1); }
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
}| 修食åãšå | ã¯ã©ã¹ | 説æ |
|---|---|---|
class |
AbstractQueuedSynchronizer.ConditionObject |
Lockå®è£
ã®åºç€ãšããŠæ©èœããAbstractQueuedSynchronizerã®Conditionå®è£
ã§ãã |
| 修食å | ã³ã³ã¹ãã©ã¯ã¿ | 説æ |
|---|---|---|
protected |
AbstractQueuedSynchronizer() |
ãŒãã®åæåæç¶æ
ã䜿çšããŠãæ°èŠ
AbstractQueuedSynchronizerã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã |
| 修食åãšå | ã¡ãœãã | 説æ |
|---|---|---|
void |
acquire(int arg) |
å²èŸŒã¿ãç¡èŠããŠãæä»ã¢ãŒãã§ååŸããŸãã
|
void |
acquireInterruptibly(int arg) |
æä»ã¢ãŒãã§ååŸããŸããå²èŸŒã¿ãçºçããå Žåã¯ãäžæ¢ããŸãã
|
void |
acquireShared(int arg) |
å²èŸŒã¿ãç¡èŠããŠãå
±æã¢ãŒãã§ååŸããŸãã
|
void |
acquireSharedInterruptibly(int arg) |
å
±æã¢ãŒãã§ååŸããŸãã
|
protected boolean |
compareAndSetState(int expect, int update) |
çŸåšã®ç¶æ
å€ãäºæ³ãããå€ã«çããå Žåãåæç¶æ
ãæå®ãããæŽæ°å€ã«ååçã«èšå®ããŸãã
|
Collection<Thread> |
getExclusiveQueuedThreads() |
æä»ã¢ãŒãã§ååŸããããã«åŸ
æ©äžã®ã¹ã¬ãããå«ãã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã
|
Thread |
getFirstQueuedThread() |
ãã¥ãŒå
ã®æåã®(åŸ
æ©æéã®ãã£ãšãé·ã)ã¹ã¬ãããè¿ããŸããçŸåšãã¥ãŒã«ã¹ã¬ãããå
¥ã£ãŠããªãå Žåã¯
nullãè¿ããŸãã |
Collection<Thread> |
getQueuedThreads() |
ããŒãããã®ååŸãåŸ
æ©ããŠããã¹ã¬ãããå«ãã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã
|
int |
getQueueLength() |
ããŒãããã®ååŸãåŸ
æ©ããŠããã¹ã¬ããã®æšå®æ°ãè¿ããŸãã
|
Collection<Thread> |
getSharedQueuedThreads() |
å
±æã¢ãŒãã§ååŸããããã«åŸ
æ©äžã®ã¹ã¬ãããå«ãã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã
|
protected int |
getState() |
åæç¶æ
ã®çŸåšå€ãè¿ããŸãã
|
Collection<Thread> |
getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition) |
ãã®ã·ã³ã¯ããã€ã¶ã«é¢é£ä»ããããæå®ã®ç¶æ
ã§åŸ
æ©äžã®ã¹ã¬ãããå«ãã³ã¬ã¯ã·ã§ã³ãè¿ããŸãã
|
int |
getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition) |
ãã®ã·ã³ã¯ããã€ã¶ã«é¢é£ä»ããããæå®ã®ç¶æ
ã§åŸ
æ©ããŠããã¹ã¬ããã®æšå®æ°ãè¿ããŸãã
|
boolean |
hasContended() |
ãã®ã·ã³ã¯ããã€ã¶ã®ååŸã§ç«¶åããŠããã¹ã¬ãããååšãããã©ãã(ã€ãŸããacquireã¡ãœããããããã¯ããããã©ãã)ãç
§äŒããŸãã
|
boolean |
hasQueuedPredecessors() |
çŸåšã®ã¹ã¬ããããé·ãã¹ã¬ãããåŸ
æ©äžã®ã¹ã¬ãããååšãããã©ããã玹ä»ããŸãã
|
boolean |
hasQueuedThreads() |
ããŒãããã®ååŸãåŸ
æ©äžã®ã¹ã¬ãããååšãããã©ãããç
§äŒããŸãã
|
boolean |
hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition) |
ãã®ã·ã³ã¯ããã€ã¶ã«é¢é£ä»ããããæå®ã®ç¶æ
ã§åŸ
æ©ããŠããã¹ã¬ãããååšãããã©ãããç
§äŒããŸãã
|
protected boolean |
isHeldExclusively() |
çŸåšã®(åŒåºãåŽã®)ã¹ã¬ããã«é¢ããŠãåæãæä»çã«è¡ãããå Žåã¯
trueãè¿ããŸãã |
boolean |
isQueued(Thread thread) |
æå®ãããã¹ã¬ããããçŸåšãã¥ãŒã«å
¥ã£ãŠããå Žåã¯trueãè¿ããŸãã
|
boolean |
owns(AbstractQueuedSynchronizer.ConditionObject condition) |
æå®ãããConditionObjectããã®ã·ã³ã¯ããã€ã¶ãããã¯ãšããŠäœ¿çšãããã©ãããç
§äŒããŸãã
|
boolean |
release(int arg) |
æä»ã¢ãŒãã§è§£æŸããŸãã
|
boolean |
releaseShared(int arg) |
å
±æã¢ãŒãã§è§£æŸããŸãã
|
protected void |
setState(int newState) |
åæç¶æ
ã®å€ãèšå®ããŸãã
|
String |
toString() |
ã·ã³ã¯ããã€ã¶ããã³ãã®ç¶æ
ãèå¥ããæååãè¿ããŸãã
|
protected boolean |
tryAcquire(int arg) |
æä»ã¢ãŒãã§ã®ååŸã詊ã¿ãŸãã
|
boolean |
tryAcquireNanos(int arg, long nanosTimeout) |
æä»ã¢ãŒãã§ååŸã詊ã¿ãŸããå²èŸŒã¿ãçºçããå Žåã¯äžæ¢ããæå®ãããã¿ã€ã ã»ã¢ãŠãæéãçµéããå Žåã¯å€±æããŸãã
|
protected int |
tryAcquireShared(int arg) |
å
±æã¢ãŒãã§ã®ååŸã詊ã¿ãŸãã
|
boolean |
tryAcquireSharedNanos(int arg, long nanosTimeout) |
å
±æã¢ãŒãã§ååŸã詊ã¿ãŸããå²èŸŒã¿ãçºçããå Žåã¯äžæ¢ããæå®ãããã¿ã€ã ã»ã¢ãŠãæéãçµéããå Žåã¯å€±æããŸãã
|
protected boolean |
tryRelease(int arg) |
æä»ã¢ãŒãã§ã®è§£æŸãåæ ããããã«ãç¶æ
ã®èšå®ã詊ã¿ãŸãã
|
protected boolean |
tryReleaseShared(int arg) |
å
±æã¢ãŒãã§ã®è§£æŸãåæ ããããã«ãç¶æ
ã®èšå®ã詊ã¿ãŸãã
|
getExclusiveOwnerThread, setExclusiveOwnerThreadprotected AbstractQueuedSynchronizer()
AbstractQueuedSynchronizerã€ã³ã¹ã¿ã³ã¹ãäœæããŸããprotected final int getState()
volatileèªèŸŒã¿ã®ã¡ã¢ãªãŒã»ã»ãã³ãã£ã¯ã¹ãä¿æããŸãã protected final void setState(int newState)
volatileæžèŸŒã¿ã®ã¡ã¢ãªãŒã»ã»ãã³ãã£ã¯ã¹ãä¿æããŸãã newState - æ°èŠç¶æ
å€protected final boolean compareAndSetState(int expect,
int update)
volatileèªã¿èŸŒã¿ããã³æžèŸŒã¿ã®ã¡ã¢ãªãŒã»ã»ãã³ãã£ã¯ã¹ãä¿æããŸãã expect - äºæ³ãããå€update - æ°ããå€trueã falseã¯ãå®éã®å€ãäºæ³ãããå€ãšç䟡ã§ã¯ãªãããšã瀺ãã protected boolean tryAcquire(int arg)
ãã®ã¡ãœããã¯åžžã«ååŸãå®è¡ããã¹ã¬ããã«ããåŒã³åºãããŸãã ãã®ã¡ãœããã倱æãã¬ããŒããããã€ã¹ã¬ããããã¥ãŒã«å
¥ããããŠããªãå ŽåãååŸã¡ãœããã¯ãã»ãã®ã¹ã¬ããããã®è§£æŸã«ããä¿¡å·ãéä¿¡ããããŸã§ãã®ã¹ã¬ããããã¥ãŒã«å
¥ããããšãã§ããŸãã ããã¯ãLock.tryLock()ã¡ãœããã®å®è£
ã«äœ¿çšã§ããŸãã
ããã©ã«ãå®è£
ã¯ãUnsupportedOperationExceptionãã¹ããŒããŸãã
arg - acquireã®åŒæ°ã ãã®å€ã¯ãåžžã«acquireã¡ãœããã«æž¡ãããå€ããŸãã¯ç¶æ
åŸ
æ©ãžã®ãšã³ããªã§ä¿åãããå€ã«ãªãã ãã以å€ã®å Žåããã®å€ã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã trueã æåæã«ã¯ããã®ãªããžã§ã¯ãã¯ååŸæžã¿ã§ããã IllegalMonitorStateException - ååŸã«ããããã®ã·ã³ã¯ããã€ã¶ãäžæ£ãªç¶æ
ã«çœ®ãããå Žåã åæãæ£ããæ©èœããããã«ã¯ããã®äŸå€ãäžè²«ããæ¹åŒã§ã¹ããŒããå¿
èŠãããã UnsupportedOperationException - æä»ã¢ãŒãããµããŒããããŠããªãå Žåprotected boolean tryRelease(int arg)
ãã®ã¡ãœããã¯ãè§£æŸãå®è¡ããã¹ã¬ããã«ããåžžã«åŒã³åºãããŸãã
ããã©ã«ãå®è£
ã¯ãUnsupportedOperationExceptionãã¹ããŒããŸãã
arg - releaseã®åŒæ°ã ãã®å€ã¯ãåžžã«releaseã¡ãœããã«æž¡ãããå€ããŸãã¯ç¶æ
åŸ
æ©ãžã®ãšã³ããªã§ã®çŸåšã®ç¶æ
å€ã«ãªãã ãã以å€ã®å Žåããã®å€ã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã trueãããã§ãªãå Žåã¯falseãIllegalMonitorStateException - è§£æŸã«ããããã®ã·ã³ã¯ããã€ã¶ãäžæ£ãªç¶æ
ã«çœ®ãããå Žåã åæãæ£ããæ©èœããããã«ã¯ããã®äŸå€ãäžè²«ããæ¹åŒã§ã¹ããŒããå¿
èŠãããã UnsupportedOperationException - æä»ã¢ãŒãããµããŒããããŠããªãå Žåprotected int tryAcquireShared(int arg)
ãã®ã¡ãœããã¯åžžã«ååŸãå®è¡ããã¹ã¬ããã«ããåŒã³åºãããŸãã ãã®ã¡ãœããã倱æãã¬ããŒããããã€ã¹ã¬ããããã¥ãŒã«å ¥ããããŠããªãå ŽåãååŸã¡ãœããã¯ãã»ãã®ã¹ã¬ããããã®è§£æŸã«ããä¿¡å·ãéä¿¡ããããŸã§ãã®ã¹ã¬ããããã¥ãŒã«å ¥ããããšãã§ããŸãã
ããã©ã«ãå®è£
ã¯ãUnsupportedOperationExceptionãã¹ããŒããŸãã
arg - acquireã®åŒæ°ã ãã®å€ã¯ãåžžã«acquireã¡ãœããã«æž¡ãããå€ããŸãã¯ç¶æ
åŸ
æ©ãžã®ãšã³ããªã§ä¿åãããå€ã«ãªãã ãã以å€ã®å Žåããã®å€ã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã IllegalMonitorStateException - ååŸã«ããããã®ã·ã³ã¯ããã€ã¶ãäžæ£ãªç¶æ
ã«çœ®ãããå Žåã åæãæ£ããæ©èœããããã«ã¯ããã®äŸå€ãäžè²«ããæ¹åŒã§ã¹ããŒããå¿
èŠãããã UnsupportedOperationException - å
±æã¢ãŒãããµããŒããããŠããªãå Žåprotected boolean tryReleaseShared(int arg)
ãã®ã¡ãœããã¯ãè§£æŸãå®è¡ããã¹ã¬ããã«ããåžžã«åŒã³åºãããŸãã
ããã©ã«ãå®è£
ã¯ãUnsupportedOperationExceptionãã¹ããŒããŸãã
arg - releaseã®åŒæ°ã ãã®å€ã¯ãåžžã«releaseã¡ãœããã«æž¡ãããå€ããŸãã¯ç¶æ
åŸ
æ©ãžã®ãšã³ããªã§ã®çŸåšã®ç¶æ
å€ã«ãªãã ãã以å€ã®å Žåããã®å€ã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã trueãããã§ãªãå Žåã¯falseIllegalMonitorStateException - è§£æŸã«ããããã®ã·ã³ã¯ããã€ã¶ãäžæ£ãªç¶æ
ã«çœ®ãããå Žåã åæãæ£ããæ©èœããããã«ã¯ããã®äŸå€ãäžè²«ããæ¹åŒã§ã¹ããŒããå¿
èŠãããã UnsupportedOperationException - å
±æã¢ãŒãããµããŒããããŠããªãå Žåprotected boolean isHeldExclusively()
trueãè¿ããŸãã éåŸ
æ©ç¶æ
ã®AbstractQueuedSynchronizer.ConditionObjectã¡ãœãããåŒã³åºãããããšã«ããã®ã¡ãœãããåŒã³åºãããŸãã (åŸ
æ©ç¶æ
ã®ã¡ãœããã§ã¯release(int)ãåŒã³åºãããã)
ããã©ã«ãå®è£
ã¯ãUnsupportedOperationExceptionãã¹ããŒããŸãã ãã®ã¡ãœããã¯ãAbstractQueuedSynchronizer.ConditionObjectã¡ãœããã§å
éšçã«ã®ã¿åŒã³åºããããããç¶æ
ã䜿çšãããªãå Žåã¯å®çŸ©ããå¿
èŠããããŸããã
trueãããã§ãªãå Žåã¯falseUnsupportedOperationException - ç¶æ
ããµããŒããããªãå Žåpublic final void acquire(int arg)
tryAcquire(int)ãåŒã³åºãããšã§å®è£
ãããæåæã«åŸ©åž°ããŸãã ãã以å€ã®å Žåãã¹ã¬ããã¯ãã¥ãŒã«å
¥ãããããããŠãã®å Žåãããã¯ããã³ãããã¯è§£é€ãäœåºŠãç¹°ãè¿ããæåãããŸã§tryAcquire(int)ãåŒã³åºããŸãã ãã®ã¡ãœããã¯ãLock.lock()ã¡ãœããã®å®è£
ã«äœ¿çšã§ããŸãã arg - acquireã®åŒæ°ã ãã®å€ã¯tryAcquire(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã public final void acquireInterruptibly(int arg)
throws InterruptedException
tryAcquire(int)ãåŒã³åºãããšã§å®è£
ãããæåæã«åŸ©åž°ããŸãã ãã以å€ã®å Žåãã¹ã¬ããã¯ãã¥ãŒã«å
¥ãããããããŠãã®å Žåãããã¯ããã³ãããã¯è§£é€ãäœåºŠãç¹°ãè¿ããæåãããã¹ã¬ããã§å²èŸŒã¿ãçºçãããŸã§tryAcquire(int)ãåŒã³åºããŸãã ãã®ã¡ãœããã¯ãLock.lockInterruptibly()ã¡ãœããã®å®è£
ã«äœ¿çšã§ããŸãã arg - acquireã®åŒæ°ã ãã®å€ã¯tryAcquire(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã InterruptedException - çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic final boolean tryAcquireNanos(int arg,
long nanosTimeout)
throws InterruptedException
tryAcquire(int)ãåŒã³åºãããšã§å®è£
ãããæåæã«åŸ©åž°ããŸãã ãã以å€ã®å Žåãã¹ã¬ããã¯ãã¥ãŒã«å
¥ãããããããŠãã®å Žåãããã¯ããã³ãããã¯è§£é€ãäœåºŠãç¹°ãè¿ããæåãããã¹ã¬ããã§å²èŸŒã¿ãçºçãããã¿ã€ã ã¢ãŠãæéãçµéãããŸã§tryAcquire(int)ãåŒã³åºããŸãã ãã®ã¡ãœããã¯ãLock.tryLock(long, TimeUnit)ã¡ãœããã®å®è£
ã«äœ¿çšã§ããŸãã arg - acquireã®åŒæ°ã ãã®å€ã¯tryAcquire(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã nanosTimeout - åŸ
æ©ããæå€§ããç§æ°trueãã¿ã€ã ã»ã¢ãŠãããå Žåã¯falseInterruptedException - çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic final boolean release(int arg)
tryRelease(int)ãtrueãè¿ãå Žåã1ã€ä»¥äžã®ã¹ã¬ããããããã¯è§£é€ããããšã§å®è£
ãããŸãã ãã®ã¡ãœããã¯ãLock.unlock()ã¡ãœããã®å®è£
ã«äœ¿çšã§ããŸãã arg - releaseã®åŒæ°ã ãã®å€ã¯tryRelease(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã tryRelease(int)ããè¿ãããå€public final void acquireShared(int arg)
tryAcquireShared(int)ãåŒã³åºãããšã§å®è£
ãããæåæã«åŸ©åž°ããŸãã ãã以å€ã®å Žåãã¹ã¬ããã¯ãã¥ãŒã«å
¥ãããããããŠãã®å Žåãããã¯ããã³ãããã¯è§£é€ãäœåºŠãç¹°ãè¿ããæåãããŸã§tryAcquireShared(int)ãåŒã³åºããŸãã arg - acquireã®åŒæ°ã ãã®å€ã¯tryAcquireShared(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã public final void acquireSharedInterruptibly(int arg)
throws InterruptedException
tryAcquireShared(int)ãåŒã³åºãããšã§å®è£
ãããæåæã«åŸ©åž°ããŸãã ãã以å€ã®å Žåãã¹ã¬ããã¯ãã¥ãŒã«å
¥ãããããããŠãã®å Žåãããã¯ããã³ãããã¯è§£é€ãäœåºŠãç¹°ãè¿ããæåãããã¹ã¬ããã§å²èŸŒã¿ãçºçãããŸã§tryAcquireShared(int)ãåŒã³åºããŸãã arg - acquireã®åŒæ°ã ãã®å€ã¯tryAcquireShared(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã InterruptedException - çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic final boolean tryAcquireSharedNanos(int arg,
long nanosTimeout)
throws InterruptedException
tryAcquireShared(int)ãåŒã³åºãããšã§å®è£
ãããæåæã«åŸ©åž°ããŸãã ãã以å€ã®å Žåãã¹ã¬ããã¯ãã¥ãŒã«å
¥ãããããããŠãã®å Žåãããã¯ããã³ãããã¯è§£é€ãäœåºŠãç¹°ãè¿ããæåãããã¹ã¬ããã§å²èŸŒã¿ãçºçãããã¿ã€ã ã¢ãŠãæéãçµéãããŸã§tryAcquireShared(int)ãåŒã³åºããŸãã arg - acquireã®åŒæ°ã ãã®å€ã¯tryAcquireShared(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã nanosTimeout - åŸ
æ©ããæå€§ããç§æ°trueãã¿ã€ã ã»ã¢ãŠãããå Žåã¯falseInterruptedException - çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic final boolean releaseShared(int arg)
tryReleaseShared(int)ãtrueãè¿ãå Žåã1ã€ä»¥äžã®ã¹ã¬ããããããã¯è§£é€ããããšã§å®è£
ãããŸãã arg - releaseã®åŒæ°ã ãã®å€ã¯tryReleaseShared(int)ã«éä¿¡ããããããã以å€ã®å Žåã¯æªè§£éãšãªããä»»æã®å€ã衚ãããšãã§ããã tryReleaseShared(int)ããè¿ãããå€public final boolean hasQueuedThreads()
trueãè¿ãããŠãã»ãã®ã¹ã¬ãããååŸãå®è¡ããããšã¯ä¿èšŒãããŸããã
ãã®å®è£ ã§ã¯ããã®æäœã¯äžå®ã®æéã§åŸ©åž°ããŸãã
truepublic final boolean hasContended()
ãã®å®è£ ã§ã¯ããã®æäœã¯äžå®ã®æéã§åŸ©åž°ããŸãã
truepublic final Thread getFirstQueuedThread()
nullãè¿ããŸãã
éåžžããã®å®è£ ã§ã¯ããã®æäœã¯äžå®æéã§åŸ©åž°ããŸãããã ããã»ãã®ã¹ã¬ããããã¥ãŒã®å€æŽã䞊è¡ããŠå®è¡ããŠããå Žåã¯ãç«¶åã«ããåŠçãç¹°ãè¿ãå ŽåããããŸãã
nullpublic final boolean isQueued(Thread thread)
ãã®å®è£ ã¯ããã¥ãŒããã©ããŒã¹ããŠæå®ãããã¹ã¬ããã®ååšãå€å¥ããŸãã
thread - ã¹ã¬ããtrueNullPointerException - ã¹ã¬ãããnullã®å Žåpublic final boolean hasQueuedPredecessors()
ãã®ã¡ãœããã®åŒåºãã¯ã次ãšåçã§ã(ãã ããå¹ççã§ããå ŽåããããŸã)ã
getFirstQueuedThread() != Thread.currentThread() &&
hasQueuedThreads()
ããããã®æç¹ã§å²ã蟌ã¿ããã³ã¿ã€ã ã»ã¢ãŠãã«ããåæ¶ããçºçããå Žåãtrueãè¿ãããŠããã»ãã®ã¹ã¬ãããçŸåšã®ã¹ã¬ãããããåã«ååŸãå®è¡ããããšã¯ä¿èšŒãããŸããã åæ§ã«ããã®ã¡ãœãããfalseãè¿ããããšããã¥ãŒã空ã§ããããšãåå ã§ãå¥ã®ã¹ã¬ããããšã³ãã¥ãŒã®ç«¶äºã«åã€å¯èœæ§ããããŸãã
ãã®ã¡ãœããã¯ãããŒãž(barging) ãåé¿ããããã«å
¬å¹³ãªã·ã³ã¯ããã€ã¶ã«ãã£ãŠäœ¿çšãããããã®ãã®ã§ãã ãã®ãããªã·ã³ã¯ããã€ã¶ã®tryAcquire(int)ã¡ãœããã¯falseãè¿ãããã®ã¡ãœãããtrueãè¿ãå Žåããã®tryAcquireShared(int)ã¡ãœããã¯è² ã®å€ãè¿ãã¯ãã§ã(ãããåå
¥å¯èœãªååŸã§ããå Žåãé€ã)ã ããšãã°ãå
¬å¹³ã§åå
¥å¯èœãªæä»ã¢ãŒãã®ã·ã³ã¯ããã€ã¶ã®tryAcquireã¡ãœããã¯ã次ã®ããã«ãªããŸãã
protected boolean tryAcquire(int arg) {
if (isHeldExclusively()) {
// A reentrant acquire; increment hold count
return true;
} else if (hasQueuedPredecessors()) {
return false;
} else {
// try to acquire normally
}
}trueãçŸåšã®ã¹ã¬ããããã¥ãŒã®å
é ã«ãããããã¥ãŒã空ã®å Žåã¯falsepublic final int getQueueLength()
public final Collection<Thread> getQueuedThreads()
public final Collection<Thread> getExclusiveQueuedThreads()
getQueuedThreads()ãšåãããããã£ãä¿æããŸãã public final Collection<Thread> getSharedQueuedThreads()
getQueuedThreads()ãšåãããããã£ãä¿æããŸãã public String toString()
"State ="ã«ç¶ããŠgetState()ã®çŸåšå€ãããã³ãã¥ãŒã空ãã©ããã«å¿ããŠ"nonempty"ãŸãã¯"empty"ãå«ãŸããŸãã public final boolean owns(AbstractQueuedSynchronizer.ConditionObject condition)
condition - ç¶æ
trueNullPointerException - ç¶æ
ãnullã®å Žåpublic final boolean hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition)
trueãè¿ãããŠããå°æ¥signalãã¹ã¬ãããèµ·åãããããšã¯ä¿èšŒãããŠããŸããã ãã®ã¡ãœããã¯ãäž»ã«ã·ã¹ãã ç¶æ
ã®ç£èŠã«äœ¿çšããç®çã§èšèšãããŠããŸãã condition - ç¶æ
trueIllegalMonitorStateException - æä»çåæãä¿æãããªãå ŽåIllegalArgumentException - æå®ãããç¶æ
ããã®ã·ã³ã¯ããã€ã¶ãšé¢é£ä»ããããŠããªãå ŽåNullPointerException - ç¶æ
ãnullã®å Žåpublic final int getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition)
condition - ç¶æ
IllegalMonitorStateException - æä»çåæãä¿æãããªãå ŽåIllegalArgumentException - æå®ãããç¶æ
ããã®ã·ã³ã¯ããã€ã¶ãšé¢é£ä»ããããŠããªãå ŽåNullPointerException - ç¶æ
ãnullã®å Žåpublic final Collection<Thread> getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition)
condition - ç¶æ
IllegalMonitorStateException - æä»çåæãä¿æãããªãå ŽåIllegalArgumentException - æå®ãããç¶æ
ããã®ã·ã³ã¯ããã€ã¶ãšé¢é£ä»ããããŠããªãå ŽåNullPointerException - ç¶æ
ãnullã®å Žå ãã°ãŸãã¯æ©èœãéä¿¡
詳现ãªAPIãªãã¡ã¬ã³ã¹ããã³éçºè
ããã¥ã¡ã³ãã«ã€ããŠã¯ãJava SEã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ãã®ããã¥ã¡ã³ãã«ã¯ãæŠå¿µçãªæŠèŠãçšèªã®å®çŸ©ãåé¿æ¹æ³ãæå¹ãªã³ãŒãäŸãªã©ã®ãéçºè
ã察象ã«ãããã詳现ãªèª¬æãå«ãŸããŠããŸãã
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyãåç
§ããŠãã ããã