螺旋锁的替代品

Aly*_*Aly 1 java user-interface synchronization spinlock

我使用以下螺旋锁方法:

while(!hasPerformedAction()){
    //wait for the user to perform the action
    //can add timer here too
}

setHasPerformedAction(false);

return getActionPerfomed();
Run Code Online (Sandbox Code Playgroud)

这基本上等待用户执行操作然后返回它.目前有些东西在继续之前请求用户回答,这就是我等到收到输入的原因.然而,我想知道这是否效率低,如果我们等待一段时间(即<= 30秒),它会减慢运行此应用程序的电脑的速度.有没有其他替代方法使用这种方法,即锁,信号量,如果是这样的语法是什么?

谢谢,

阿里

Pau*_*and 9

实际上,这不仅效率低下,甚至无法保证工作,因为您所显示的代码中没有"发生在前"的边缘.要创建一个先发生的边缘,您需要执行以下操作之一:

  1. 访问volatile变量
  2. 在共享资源上同步
  3. 使用并发utils锁.

正如另一条评论中所提到的,最简单的解决方案就是确保你的标志是一个易变的变量,并简单地在你的循环中抛出一个短暂的睡眠.

但是,最好的办法是对共享变量进行同步/等待/通知.

您需要阅读的方法是等待通知.有关如何使用这些内容的更好说明,请阅读本文.示例代码段如下所示;

线程1

Object shared = new Object();
startThread2(shared);
synchronized (shared) {
  while (taskNotDone())
    shared.wait();
}
Run Code Online (Sandbox Code Playgroud)

线程2

// shared was saved at the start of the thread
// do some stuff
markTaskAsDone();
synchronized (shared) {
  shared.notify();
}
Run Code Online (Sandbox Code Playgroud)