public class StampedLock extends Object implements Serializable
writeLock()ã¡ãœããã¯ãæä»çã¢ã¯ã»ã¹ãåŸ
æ©ããŠãããã¯ããå¯èœæ§ããããããã¯ãè§£æŸããããã«unlockWrite(long)ã¡ãœããã§äœ¿çšã§ããã¹ã¿ã³ããè¿ããŸãã æéæå®ã®ãªãããŒãžã§ã³ãšæéæå®ã®ããããŒãžã§ã³ã®tryWriteLockãçšæãããŠããŸãã ããã¯ãæžèŸŒã¿ã¢ãŒãã§ä¿æãããŠãããšãã¯ãèªåãããã¯ãååŸããããšã¯ã§ããããªããã£ãã¹ãã£ãã¯èªåãæ€èšŒã¯ãã¹ãŠå€±æããŸãã readLock()ã¡ãœããã¯ãéæä»çã¢ã¯ã»ã¹ãåŸ
æ©ããŠãããã¯ããå¯èœæ§ããããããã¯ãè§£æŸããããã«unlockRead(long)ã¡ãœããã§äœ¿çšã§ããã¹ã¿ã³ããè¿ããŸãã æéæå®ã®ãªãããŒãžã§ã³ãšæéæå®ã®ããããŒãžã§ã³ã®tryReadLockãçšæãããŠããŸãã tryOptimisticRead()ã¡ãœããã¯ãçŸåšããã¯ãæžèŸŒã¿ã¢ãŒãã§ä¿æãããŠããªãå Žåã®ã¿ããŒã以å€ã®ã¹ã¿ã³ããè¿ããŸãã validate(long)ã¡ãœããã¯ãæå®ãããã¹ã¿ã³ãã®ååŸä»¥éã«ããã¯ãæžèŸŒã¿ã¢ãŒãã§ååŸãããŠããªãå Žåãtrueãè¿ããŸãã ãã®ã¢ãŒãã¯ãã©ã€ã¿ãŒããã€ã§ãç Žãããšã®ã§ãããããããŠåŒ±ãèªåãããã¯ãšèŠãªãããšãã§ããŸãã èªåãå°çšã®çãã³ãŒãã»ã»ã°ã¡ã³ãã«ãªããã£ãã¹ãã£ãã¯ã»ã¢ãŒãã䜿çšãããšãç«¶åãæžããã¹ã«ãŒããããåäžããšããããããŸãã ãã ãããã®äœ¿çšã¯æ¬è³ªçã«è匱ã§ãã ãªããã£ãã¹ãã£ãã¯èªåãã»ã¯ã·ã§ã³ã§ã¯ããã£ãŒã«ããèªã¿åããããããåŸã§æ€èšŒããŠãã䜿çšããããã«ããŒã«ã«å€æ°ã«ä¿æããããšã ããè¡ãã¹ãã§ãã ãªããã£ãã¹ãã£ãã¯ã»ã¢ãŒãã§ã¯ãèªã¿åããããã£ãŒã«ãã倧ããççŸããŠããå¯èœæ§ããããããäžè²«æ§ããã§ãã¯ãããvalidate()ã¡ãœãããç¹°ãè¿ãåŒã³åºãããããããã®ããŒã¿è¡šçŸã«ååç¿çããŠããå Žåã«ããã䜿çšã§ããŸãã ããšãã°ãæåã«ãªããžã§ã¯ãåç
§ãŸãã¯é
ååç
§ãèªã¿åããæ¬¡ã«ãã®ãã£ãŒã«ããèŠçŽ ããŸãã¯ã¡ãœããã®1ã€ã«ã¢ã¯ã»ã¹ããå Žåãéåžžãã®ãããªã¹ããããå¿
èŠã«ãªããŸãã ãã®ã¯ã©ã¹ã¯ãæ¡ä»¶ã«å¿ããŠ3ã€ã®ã¢ãŒãéã®å€æãæäŸããã¡ãœããããµããŒãããŠããŸãã ããšãã°ãtryConvertToWriteLock(long)ã¡ãœããã¯ã¢ãŒãã®ãã¢ããã°ã¬ãŒããã詊ã¿ã(1)ãã§ã«æžèŸŒã¿ã¢ãŒãã®å Žåã(2)èªåãã¢ãŒãã§ä»ã«ãªãŒããŒããªãå ŽåããŸãã¯(3)ãªããã£ãã¹ãã£ãã¯ã»ã¢ãŒãã§ããã¯ã䜿çšå¯èœãªå Žåã¯ãæå¹ãªæžèŸŒã¿ã¹ã¿ã³ããè¿ããŸãã ãããã®ã¡ãœããã®åœ¢åŒã¯ãå詊è¡ããŒã¹ã®èšèšã§çºçããã³ãŒãã®èšåŒµããããã軜æžã§ããããã«èšèšãããŠããŸãã
StampedLockã¯ãã¹ã¬ããã»ãŒããªã³ã³ããŒãã³ãã®éçºã§å éšãŠãŒãã£ãªãã£ãšããŠäœ¿çšããããã«èšèšãããŠããŸãã ãããã䜿çšããã«ã¯ãä¿è·ããããŒã¿ããªããžã§ã¯ããããã³ã¡ãœããã®å éšããããã£ã®ç¥èãå¿ èŠã§ãã ãããã¯åå ¥å¯èœã§ã¯ãªããããããã¯ãããŠããæ¬äœã§ã¯ãããã¯ã®åååŸã詊ã¿ãå¯èœæ§ã®ããä»ã®äžæãªã¡ãœãããåŒã³åºãã¹ãã§ã¯ãããŸãã(ãã ããã¹ã¿ã³ãã䜿çšãŸãã¯å€æã§ããä»ã®ã¡ãœããã«ã¹ã¿ã³ããæž¡ãããšã¯ã§ããŸã)ã èªåãããã¯ã»ã¢ãŒãã䜿çšããã«ã¯ãé¢é£ããã³ãŒãã»ã»ã¯ã·ã§ã³ãå¯äœçšãæã£ãŠããªãããšãå¿ èŠã§ãã æªæ€èšŒã®ãªããã£ãã¹ãã£ãã¯èªåãã»ã¯ã·ã§ã³ã§ã¯ãæœåšçãªäžæŽåã蚱容ã§ããããšãããã£ãŠããªãã¡ãœãããåŒã³åºãããšã¯ã§ããŸããã ã¹ã¿ã³ãã¯æé衚瀺ã䜿çšããæå·çã«ã»ãã¥ã¢ã§ã¯ãããŸãã(ã€ãŸããæå¹ãªã¹ã¿ã³ããæšæž¬å¯èœãªå ŽåããããŸã)ã ã¹ã¿ã³ãã®å€ã¯ã1幎以äžã®é£ç¶åäœã®åŸã§å埪ç°ããå ŽåããããŸãã ããããé·ãæéã䜿çšãæ€èšŒããããã«ä¿æãããã¹ã¿ã³ãã¯ãæ£ããæ€èšŒã§ããªãå ŽåããããŸãã StampedLockã¯çŽååå¯èœã§ãããåžžã«åæã®ããã¯è§£é€ãããç¶æ ã«çŽåå埩å ãããããããªã¢ãŒãã»ããã¯ã«ã¯åœ¹ç«ã¡ãŸããã
StampedLockã®ã¹ã±ãžã¥ãŒãªã³ã°ã»ããªã·ãŒã§ã¯ããªãŒããŒãšã©ã€ã¿ãŒã®ã©ã¡ããåªå ãããã«äžè²«æ§ããããŸããã ãtryãã¡ãœããã¯ãã¹ãŠãã¹ãã»ãšãã©ãŒãåã§ãããã¹ã±ãžã¥ãŒãªã³ã°ã»ããªã·ãŒãå ¬å¹³æ§ããªã·ãŒã«å¿ ãããæºæ ããŠããŸããã ããã¯ãååŸãŸãã¯å€æãããtryãã¡ãœãããããŒããè¿ãããå Žåãããã¯ã®ç¶æ ã«é¢ããæ å ±ã¯æäŸãããŸããããã以éã®åŒã³åºããæåããå ŽåããããŸãã
ãã®ã¯ã©ã¹ã§ã¯ãè€æ°ã®ããã¯ã»ã¢ãŒãã調æŽããäœ¿çšæ¹æ³ããµããŒããããŠãããããLockã€ã³ã¿ãã§ãŒã¹ãReadWriteLockã€ã³ã¿ãã§ãŒã¹ã¯çŽæ¥å®è£
ãããŸããã ãã ããé¢é£ããæ©èœã»ããã ããå¿
èŠãšããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãStampedLockãasReadLock()ãasWriteLock()ããŸãã¯asReadWriteLock()ãšèŠãªãããããšããããŸãã
䜿çšäŸã åçŽãª2次å
ã®ç¹ãä¿æããã¯ã©ã¹ã«ãããããã€ãã®äœ¿ç𿹿³ã次ã«ç€ºããŸãã ãµã³ãã«ã»ã³ãŒãã«ã¯ããã€ãã®try/catchææ³ã瀺ãããŠããŸããããã®æ¬äœã§äŸå€ãçºçããå¯èœæ§ã¯ãªããããããã§ã¯ããããå³å¯ã«å¿
èŠãªããã§ã¯ãããŸããã
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
void move(double deltaX, double deltaY) { // an exclusively locked method
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
double distanceFromOrigin() { // A read-only method
long stamp = sl.tryOptimisticRead();
double currentX = x, currentY = y;
if (!sl.validate(stamp)) {
stamp = sl.readLock();
try {
currentX = x;
currentY = y;
} finally {
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
void moveIfAtOrigin(double newX, double newY) { // upgrade
// Could instead start with optimistic, not read mode
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws;
x = newX;
y = newY;
break;
}
else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
}
}
}| ã³ã³ã¹ãã©ã¯ã¿ | 説æ |
|---|---|
StampedLock() |
æ°ããããã¯ããæåã¯ããã¯è§£é€ãããç¶æ
ã§äœæããŸãã
|
| 修食åãšå | ã¡ãœãã | 説æ |
|---|---|---|
Lock |
asReadLock() |
ãã®StampedLockã®ãã¬ãŒã³ãª
Lockãã¥ãŒãè¿ããŸããããã§ã¯ãLock.lock()ã¡ãœãããreadLock()ã«ããããããä»ã®ã¡ãœãããåæ§ã«ããããããŸãã |
ReadWriteLock |
asReadWriteLock() |
ãã®StampedLockã®
ReadWriteLockãã¥ãŒãè¿ããŸããããã§ã¯ãReadWriteLock.readLock()ã¡ãœãããasReadLock()ã«ããããããReadWriteLock.writeLock()ãasWriteLock()ã«ããããããŸãã |
Lock |
asWriteLock() |
ãã®StampedLockã®ãã¬ãŒã³ãª
Lockãã¥ãŒãè¿ããŸããããã§ã¯ãLock.lock()ã¡ãœãããwriteLock()ã«ããããããä»ã®ã¡ãœãããåæ§ã«ããããããŸãã |
int |
getReadLockCount() |
ãã®ããã¯çšã«ä¿æãããŠããèªèŸŒã¿ããã¯ã®æ°ãç
§äŒããŸãã
|
boolean |
isReadLocked() |
çŸåšããã¯ãéæä»çã«ä¿æãããŠããå Žåã¯
trueãè¿ããŸãã |
boolean |
isWriteLocked() |
çŸåšããã¯ãæä»çã«ä¿æãããŠããå Žåã¯
trueãè¿ããŸãã |
long |
readLock() |
ããã¯ãéæä»çã«ååŸããå©çšå¯èœã«ãªããŸã§å¿
èŠã«å¿ããŠãããã¯ããŸãã
|
long |
readLockInterruptibly() |
ããã¯ãéæä»çã«ååŸããå©çšå¯èœã«ãªããŸã§ããŸãã¯çŸåšã®ã¹ã¬ãããå²ã蟌ãŸãããŸã§ãå¿
èŠã«å¿ããŠãããã¯ããŸãã
|
String |
toString() |
ãã®ããã¯ããã³ãã®ç¶æ
ãèå¥ããæååãè¿ããŸãã
|
long |
tryConvertToOptimisticRead(long stamp) |
ããã¯ç¶æ
ãæå®ãããã¹ã¿ã³ããšäžèŽããå Žåããã®ã¹ã¿ã³ããããã¯ã®ä¿æã衚ããŠããã°ããããè§£é€ããç£èŠã¹ã¿ã³ããè¿ããŸãã
|
long |
tryConvertToReadLock(long stamp) |
ããã¯ç¶æ
ãæå®ãããã¹ã¿ã³ããšäžèŽããå Žåã«ã次ã®ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
|
long |
tryConvertToWriteLock(long stamp) |
ããã¯ç¶æ
ãæå®ãããã¹ã¿ã³ããšäžèŽããå Žåã«ã次ã®ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
|
long |
tryOptimisticRead() |
åŸã§æ€èšŒã§ããã¹ã¿ã³ããè¿ããŸããæä»çã«ããã¯ãããŠããå Žåã¯ãŒããè¿ããŸãã
|
long |
tryReadLock() |
ããã¯ãããã«å©çšã§ããå Žåã«ããããéæä»çã«ååŸããŸãã
|
long |
tryReadLock(long time, TimeUnit unit) |
æå®ãããæéå
ã§ããã¯ãå©çšå¯èœã«ãªããçŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããŠããªãå Žåã«ããããéæä»çã«ååŸããŸãã
|
boolean |
tryUnlockRead() |
èªåãããã¯ãä¿æãããå Žåã«ãã¹ã¿ã³ãå€ãå¿
èŠãšããªãã§ããã®ä¿æãè§£é€ããŸãã
|
boolean |
tryUnlockWrite() |
æžèŸŒã¿ããã¯ãä¿æãããå Žåã«ãã¹ã¿ã³ãå€ãå¿
èŠãšããªãã§ããããè§£é€ããŸãã
|
long |
tryWriteLock() |
ããã¯ãããã«å©çšã§ããå Žåã«ããããæä»çã«ååŸããŸãã
|
long |
tryWriteLock(long time, TimeUnit unit) |
æå®ãããæéå
ã§ããã¯ãå©çšå¯èœã«ãªããçŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããŠããªãå Žåã«ããããæä»çã«ååŸããŸãã
|
void |
unlock(long stamp) |
ããã¯ç¶æ
ãæå®ãããã¹ã¿ã³ããšäžèŽããå Žåã«ã察å¿ããããã¯ã»ã¢ãŒããè§£é€ããŸãã
|
void |
unlockRead(long stamp) |
ããã¯ç¶æ
ãæå®ãããã¹ã¿ã³ããšäžèŽããå Žåã«ãéæä»ããã¯ãè§£é€ããŸãã
|
void |
unlockWrite(long stamp) |
ããã¯ç¶æ
ãæå®ãããã¹ã¿ã³ããšäžèŽããå Žåã«ãæä»ããã¯ãè§£é€ããŸãã
|
boolean |
validate(long stamp) |
æå®ãããã¹ã¿ã³ãã®çºè¡ä»¥éã«ããã¯ãæä»çã«ååŸãããªãã£ãå Žåã«trueãè¿ããŸãã
|
long |
writeLock() |
ããã¯ãæä»çã«ååŸããå¿
èŠã«å¿ããŠå©çšå¯èœã«ãªããŸã§ãããã¯ããŸãã
|
long |
writeLockInterruptibly() |
ããã¯ãæä»çã«ååŸããå¿
èŠã«å¿ããŠå©çšå¯èœã«ãªãããçŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçãããŸã§ãããã¯ããŸãã
|
public StampedLock()
public long writeLock()
public long tryWriteLock()
public long tryWriteLock(long time,
TimeUnit unit)
throws InterruptedException
Lock.tryLock(long,TimeUnit)ã¡ãœããã«æå®ãããŠãããã®ãšåãã§ãã time - ããã¯ã®æé·åŸ
æ©æéunit - timeåŒæ°ã®æéåäœInterruptedException - ããã¯ãååŸããåã«çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic long writeLockInterruptibly()
throws InterruptedException
Lock.lockInterruptibly()ã¡ãœããã«æå®ãããŠãããã®ãšåãã§ãã InterruptedException - ããã¯ãååŸããåã«çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic long readLock()
public long tryReadLock()
public long tryReadLock(long time,
TimeUnit unit)
throws InterruptedException
Lock.tryLock(long,TimeUnit)ã¡ãœããã«æå®ãããŠãããã®ãšåãã§ãã time - ããã¯ã®æé·åŸ
æ©æéunit - timeåŒæ°ã®æéåäœInterruptedException - ããã¯ãååŸããåã«çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic long readLockInterruptibly()
throws InterruptedException
Lock.lockInterruptibly()ã¡ãœããã«æå®ãããŠãããã®ãšåãã§ãã InterruptedException - ããã¯ãååŸããåã«çŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçããå Žåpublic long tryOptimisticRead()
public boolean validate(long stamp)
tryOptimisticRead()ãŸãã¯ãã®ããã¯ã®ããã¯ã»ã¡ãœããããååŸããããã®ã§ã¯ãªãå€ãæå®ããŠãã®ã¡ãœãããåŒã³åºããå Žåããã®å¹æãçµæã¯å®çŸ©ãããŠããŸããã stamp - ã¹ã¿ã³ãtrueããã以å€ã®å Žåã¯falsepublic void unlockWrite(long stamp)
stamp - æžèŸŒã¿ããã¯æäœã«ãã£ãŠè¿ãããã¹ã¿ã³ãIllegalMonitorStateException - ã¹ã¿ã³ãããã®ããã¯ã®çŸåšã®ç¶æ
ãšäžèŽããªãå Žåpublic void unlockRead(long stamp)
stamp - èªåãããã¯æäœã«ãã£ãŠè¿ãããã¹ã¿ã³ãIllegalMonitorStateException - ã¹ã¿ã³ãããã®ããã¯ã®çŸåšã®ç¶æ
ãšäžèŽããªãå Žåpublic void unlock(long stamp)
stamp - ããã¯æäœã«ãã£ãŠè¿ãããã¹ã¿ã³ãIllegalMonitorStateException - ã¹ã¿ã³ãããã®ããã¯ã®çŸåšã®ç¶æ
ãšäžèŽããªãå Žåpublic long tryConvertToWriteLock(long stamp)
stamp - ã¹ã¿ã³ãpublic long tryConvertToReadLock(long stamp)
stamp - ã¹ã¿ã³ãpublic long tryConvertToOptimisticRead(long stamp)
stamp - ã¹ã¿ã³ãpublic boolean tryUnlockWrite()
trueããã以å€ã®å Žåã¯falsepublic boolean tryUnlockRead()
trueããã以å€ã®å Žåã¯falsepublic boolean isWriteLocked()
trueãè¿ããŸããtruepublic boolean isReadLocked()
trueãè¿ããŸããtruepublic int getReadLockCount()
public String toString()
"Unlocked"ãŸãã¯æåå"Write-locked"ãŸãã¯æåå"Read-locks:"ã«ç¶ããŠãçŸåšä¿æãããŠããèªåãããã¯ã®æ°ãå«ãŸããŸãã public Lock asReadLock()
Lockãã¥ãŒãè¿ããŸããããã§ã¯ãLock.lock()ã¡ãœãããreadLock()ã«ããããããä»ã®ã¡ãœãããåæ§ã«ããããããŸãã è¿ãããLockã¯ConditionããµããŒãããŠããªããããLock.newCondition()ã¡ãœããã¯UnsupportedOperationExceptionãã¹ããŒããŸãã public Lock asWriteLock()
Lockãã¥ãŒãè¿ããŸããããã§ã¯ãLock.lock()ã¡ãœãããwriteLock()ã«ããããããä»ã®ã¡ãœãããåæ§ã«ããããããŸãã è¿ãããLockã¯ConditionããµããŒãããŠããªããããLock.newCondition()ã¡ãœããã¯UnsupportedOperationExceptionãã¹ããŒããŸãã public ReadWriteLock asReadWriteLock()
ReadWriteLockãã¥ãŒãè¿ããŸããããã§ã¯ãReadWriteLock.readLock()ã¡ãœãããasReadLock()ã«ããããããReadWriteLock.writeLock()ãasWriteLock()ã«ããããããŸãã ãã°ãŸãã¯æ©èœãéä¿¡
詳现ãªAPIãªãã¡ã¬ã³ã¹ããã³éçºè
ããã¥ã¡ã³ãã«ã€ããŠã¯ãJava SEã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ãã®ããã¥ã¡ã³ãã«ã¯ãæŠå¿µçãªæŠèŠãçšèªã®å®çŸ©ãåé¿æ¹æ³ãæå¹ãªã³ãŒãäŸãªã©ã®ãéçºè
ã察象ã«ãããã詳现ãªèª¬æãå«ãŸããŠããŸãã
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyãåç
§ããŠãã ããã