【发布时间】:2012-10-03 23:52:54
【问题描述】:
我发现以下代码不起作用,因为 while 循环无限期地窃取锁:
public void run()
{
while(true)
{
synchronized(run)
{
if (!run) break;
[code]
}
}
}
public void stopRunning()
{
synchronized(run)
{
run = false;
}
}
我的目标是确保在我知道我的 run() 函数不再实际运行之前,我不会从 stopRunning() 命令返回。我试图阻止 run 函数继续引用我正在销毁的其他东西。我的第一个想法是在 synchronized(run) 之前添加一行代码,例如 Thread.sleep(100) 以确保它释放锁。这是推荐的做法还是我忽略了什么[愚蠢/明显]?
谢谢!
【问题讨论】:
-
我没有看到任何提示。你有什么特别的想法,你认为我可能会看到吗?
-
也许我在这方面不正确,但是因为您在只读情况下使用运行变量,所以您不必担心使用同步。
-
假设您将条件变量标记为 volatile,这是正确的——您不需要同步。但是 run() 可能需要一点时间才能意识到条件变量的值已经改变,并且它会继续访问正在被其他线程破坏的东西。调用 stopRunning() 的线程需要等待 run() 线程完成。
标签: android thread-safety synchronized