http://winterbe.com/posts/2015/04/30/java8-concurrency-tutorial-synchronized-locks-examples/包含以下代码:
StampedLock lock = new StampedLock();
long stamp = lock.readLock();
try {
if (count == 0) {
stamp = lock.tryConvertToWriteLock(stamp);
if (stamp == 0L) {
System.out.println("Could not convert to write lock");
stamp = lock.writeLock();
}
count = 23;
}
System.out.println(count);
} finally {
lock.unlock(stamp);
}
Run Code Online (Sandbox Code Playgroud)
作者写道:
调用
tryConvertToWriteLock()不会阻塞,但可能会返回一个零戳,表明当前没有可用的写锁。在这种情况下,我们调用writeLock()阻塞当前线程,直到写锁可用。
关于tryConvertToWriteLock()失败的情况,是我错过了什么,还是作者获得了读锁,然后是写锁,并且从未释放过读锁?
此外,不会lock.writeLock()死锁等待当前线程释放其读锁吗?
我相信文章提供的代码示例有问题。根据https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/locks/StampedLock.html
与 Semaphore 类似,但与大多数 Lock 实现不同的是,StampedLocks没有所有权的概念。在一个线程中获得的锁可以在另一个线程中释放或转换。
此外,他们提供了以下示例代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
注意他们如何在获取写锁之前释放读锁。
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |