- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
class Foo {
private ReentrantLock _lock;
private Condition _cond;
private Thread _thr;
private LinkedList<String> _msgQueue;
public Foo() {
_lock = new ReentrantLock();
_cond = _lock.newCondition();
_msgQueue = new LinkedList<String>();
startThread();
}
public void putMsg(String msg) throws Exception {
_lock.lock();
_msgQueue.addLast(msg);
_cond.signal();
System.out.println(Thread.currentThread().getId() + ": Signal write thread.");
_lock.unlock();
System.out.println(Thread.currentThread().getId() + ": Unlocked.");
}
private void startThread() {
_thr = new Thread() {
public void run() {
_lock.lock();
while(true) {
try {
while (!_msgQueue.isEmpty()) {
String msg = _msgQueue.getFirst();
System.out.println(msg);
_msgQueue.removeFirst();
}
System.out.println(Thread.currentThread().getId() + ": getHoldCount:" + _lock.getHoldCount());
System.out.println((Thread.currentThread().getId() + ": isLocked:" + _lock.isLocked()));
System.out.println(Thread.currentThread().getId() + ": isHeldByCurrentThread:" + _lock.isHeldByCurrentThread());
System.out.println(Thread.currentThread().getId() + ": Awaiting...");
_cond.await();
System.out.println(Thread.currentThread().getId() + ": Write thread awaken");
} catch (Exception e) {
e.printStackTrace();
break;
} finally {
try {
_lock.unlock();
} catch (Exception e) {
}
}
}
System.out.println("Write thread exit.");
}
};
_thr.start();
}
}
public class LockTest {
public static void main(String[] args) throws Exception {
Foo foo = new Foo();
foo.putMsg("Msg 1");
foo.putMsg("Msg 2");
Thread.sleep(1000);
foo.putMsg("Msg 3");
}
}
The code output after one running:1: Signal write thread.1: Unlocked.1: Signal write thread.1: Unlocked.Msg 1Msg 28: getHoldCount:18: isLocked:true8: isHeldByCurrentThread:true8: Awaiting...1: Signal write thread.1: Unlocked.8: Write thread awakenMsg 38: getHoldCount:08: isLocked:false8: isHeldByCurrentThread:false8: Awaiting...Write thread exit.java.lang.IllegalMonitorStateException atjava.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source) atjava.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer.fullyRelease(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source) at Foo$1.run(LockTest.java:44)
问题是:根据http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Condition.html#await() ,当线程返回时,保证持有该锁。但从输出中我们看到await()返回后,它并没有重新获取锁。这是一个错误还是我犯了一些错误?
最佳答案
According to http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Condition.html#await(), when the thread returns it is guaranteed to hold this lock.
确实如此,但它也说线程在调用方法之前必须持有锁:
The current thread is assumed to hold the lock associated with this Condition when this method is called. It is up to the implementation to determine if this is the case and if not, how to respond. Typically, an exception will be thrown (such as IllegalMonitorStateException) and the implementation must document that fact.
这与“普通”监视器(Object#wait)的工作方式相同:开始等待时必须持有锁(在 Object#wait 的情况下使用同步块(synchronized block),此处使用 Lock#lock)。然后锁将被释放,您等待。当等待结束时,你也再次持有锁。
关于Java Condition 在await() 返回后无法重新获取与其关联的锁(ReentrantLock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824875/
我有一个 forEach循环处理数组中的数据。在该循环中间的某个地方,我必须等待 DOM 元素的更改,获取该更改,处理它,然后才能继续处理数组。 我希望在控制台中看到这个: Preparing "aa
给定以下方法: public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync();
尝试在 .exports 中运行一个异步函数,获取 Promise,然后在下一个异步函数中使用结果,但由于某种原因,无论等待如何,第二个函数都会在第一个函数之前执行。 销售.js = const sq
谁能解释为什么 c# 5 中的异步函数需要至少有 1 个等待?我找不到明确的理由/解释。 所谓必需,是指当异步函数内部没有任何 await 调用时编译器会发出警告,但不会抛出编译错误。 来自 this
我想用 Mocha 测试异步代码. 我跟着这个教程testing-promises-with-mocha .最后,它说最好的方法是 async/await。 以下是我的代码,我打算将 setTimeo
这个问题在这里已经有了答案: How do yield and await implement flow of control in .NET? (5 个答案) How is resumption
我想在 trait 中编写异步函数,但是因为 async fn in traits 还不被支持,我试图找到等效的方法接口(interface)。这是我在 Rust nightly (2019-01-0
在 node.js 中,我有一个数据库事务,我想在 then 回调中调用一个 async 方法,但我收到错误消息 关键字“等待”已保留。 这是异步 saveImage 函数: const saveIm
我正在包装 AspNet.Identity。但有些事情让我对 TPL 感到困惑。 第一个例子: public virtual async Task RemovePasswordAsync(st
我有三个 showDialog 示例。我认为 _showAlert1 是正确的,但它使用 2 个函数来实现它。 _showAlert2 也有效,但我认为它不正确,因为我认为 showDialog 是异
我正在编写一个应该尽可能快地执行所有异步函数的函数,但是,它们中只有 5 个可以同时运行。 我想使用 Promise.race 来实现,所以实现不是最好的。问题是代码执行不会在 await 处停止。我
在 Scala 和其他编程语言中,可以使用 Futures 和 Await。 (在实际代码中,会使用例如 zip+map 而不是 Await) def b1() = Future { 1 } def
这个问题在这里已经有了答案: At the end of an async method, should I return or await? (2 个回答) 8年前关闭。 我做了一些阅读,并认为我已
我知道这是一个非常开放的问题,我深表歉意。 我可以看到 Await.ready返回 Awaitable.type而 Await.result返回 T但我仍然混淆他们。 两者有什么区别? 一个是阻塞的,
为什么等待者(GetAwaiter - 使类可等待)是结构而不是类。使用类有什么坏处吗? public struct ConfiguredTaskAwaiter : ICriticalNotifyCo
这个问题在这里已经有了答案: Why doesn't Scala's Future have a .get / get(maxDuration) method, forcing us to resor
async/await 链中的所有函数都必须使用 async/await 关键字吗? async function one() { return await fetch(.....); } asy
点击组件的按钮时将执行以下方法。 async onClickButton() { await this.shoppingCartService.add(this.selectedOffer);
它似乎被记录在案的唯一地方是 this issue thread和 the actual specification .但是,删除的原因并没有在我能找到的任何地方发布。 新的推荐方式似乎是await
为什么使用 await 需要将其外部函数声明为 async? 例如,为什么这个 mongoose 语句需要它所在的函数来返回一个 promise? async function middleware(
我是一名优秀的程序员,十分优秀!