我正在使用以下自旋锁方法:
while(!hasPerformedAction()){
//wait for the user to perform the action
//can add timer here too
}
setHasPerformedAction(false);
return getActionPerfomed();
这基本上是在等待用户执行某项操作,然后将其返回。当前,有些东西在继续之前需要用户的回答,这就是为什么我等到收到输入为止。但是我想知道这是否效率低下,如果我们等待一段时间(即
谢谢,
艾莉
最佳答案
实际上,这不仅效率低下,而且甚至不能保证它能正常工作,因为所显示的代码中没有“先于”边缘。要创建happens-before edge,您需要执行以下一项操作:
访问一个可变变量
在共享资源上同步
使用并发的utils锁。
如另一条评论中所述,最简单的解决方案就是确保您的标志是一个volatile变量,并在循环中短暂睡眠。
但是,最好的办法是对共享变量进行同步/等待/通知。
您需要阅读的方法是wait和notify。有关如何使用它们的更好说明,请阅读this article。下面显示了一个示例代码片段;
线程1
Object shared = new Object();
startThread2(shared);
synchronized (shared) {
while (taskNotDone())
shared.wait();
}
线程2
// shared was saved at the start of the thread
// do some stuff
markTaskAsDone();
synchronized (shared) {
shared.notify();
}
关于java - 自旋锁的替代品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2173309/