【发布时间】:2014-12-29 19:51:50
【问题描述】:
考虑以下代码:
// Below block executed by thread t1
synchronized(obj) {
obj.wait(0);
}
// This block executed by thread t2
synchronized(obj) {
obj.notify();
}
我知道在上面的代码中,如果t1 拥有同步块的所有权,同时如果线程t2 尝试获取同步块,那么t2 会等待内核等待。
我想避免这种情况并在块之前旋转t2,直到t1 调用等待并留下块的所有权。这可能吗?
【问题讨论】:
-
请在点击提交之前花更多的精力来格式化您的帖子 - 使用预览查看帖子的外观,并且仅在您希望它看起来像 你回答了这个问题。
-
此外,您是否有证据表明这实际上会导致您的代码出现问题?自旋锁很少是正确的解决方案 - 请记住,
t1将在调用wait()时立即放弃锁,因此 t2 阻塞的机会窗口非常小。 -
你为什么要这样做?相反,在一个线程上等待锁,您将有一个线程在等待锁,同时浪费 CPU 周期。
-
我对这个代码块的使用太啰嗦,多个线程等待并通知,我不希望我的线程进入内核等待,而是我可以旋转一点并获得所有权
-
同意 OP 应该扩展“为什么” - 但如果从来没有很好的需求,则不会创建
java.util.concurrent.locks包。
标签: java multithreading thread-synchronization spinlock