竞争条件“检查然后行动”和“读-修改-写”

Hai*_*ang 6 java race-condition

任何人都可以向我解释什么是竞争条件,如何避免它,以及如何在 Java 代码中找到它?

好吧,我几天才知道“竞争条件”,我有两个例子,也许它们不够好,这就是为什么我需要你的帮助:)希望你们中的任何人都可以为我解释。

示例1:检查然后采取行动:

if(vector.contains(e))//check
{
vector.remove(e)
}
Run Code Online (Sandbox Code Playgroud)

如果有2个线程可以访问,线程1在检查向量包含e后挂起,e在向量中,然后线程2访问检查然后从向量中删除e,然后线程1回来做删除动作,会发生错误,因为e是已被 thread2 删除。

示例2:读取修改写入:

假设我们在一个方法中有一个计数器变量,一旦方法被调用,计数器增加1,

counter++
Run Code Online (Sandbox Code Playgroud)

这不是原子操作,它有 3 个步骤: 1. 获取值 2. 增加值 3. 分配给值

我对比赛条件的了解都在这里,希望您能与我分享您的知识:)

谢谢

i_a*_*ero 4

什么是竞争条件?\n检查此堆栈溢出问题

\n\n

竞争条件主要有两种情况:读-修改-写和检查-然后-执行。

\n\n

对于读-修改-写的经典例子是counter++原子操作,因此会导致竞争条件。

\n\n

对于“检查然后行动”,有多个示例。一个例子是,当您检查 ConcurrentHashMap 中的键是否存在,然后在 if-case 中执行一些操作时。另一个例子是单例类代码:

\n\n
public Singleton getInstance()\n{\n   if(_instance == null)\n   {\xc2\xa0\n     \xc2\xa0_instance = new Singleton();\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以在互联网上阅读有关它们的更多信息。Brian Goetz 写的一本关于并发的好书是《Java Concurrency in Practice》。你还可以找到这篇文章很有帮助。

\n