线程安全是否意味着没有竞争条件?

ConcurrentHashMap是线程安全的,但是会发生竞争条件,因为据我了解,仅映射的一部分被锁定并且仅用于写操作,这意味着如果同时存在读取操作,则将存在竞争条件。

但是我在这里也读到https://en.wikipedia.org/wiki/Thread_safety

Thread safe: Implementation is guaranteed to be free of race conditions when accessed by multiple threads simultaneously.

我可以说ConcurrentHashMap是线程安全的,但不能完全同步吗?这里正确的术语是什么?

ahricher1 回答:线程安全是否意味着没有竞争条件?

我不知道“线程安全”的正式定义。

当人们说某些 class 是线程安全的时,它们通常意味着多个线程并发使用类方法不会导致使阅读过类文档的合理程序员感到惊讶的行为。

Map的“线程安全”含义如下:

  • 如果两个或多个线程存储不同的密钥,则所有存储都将发生。
  • 如果两个或多个线程为同一密钥存储不同的值,则将至少发生一个存储。
  • 如果一个线程存储某个键的值,而另一个线程尝试获取该键的值,则读取线程将获取旧值或新值。
  • 由于多个线程访问和/或存储其他密钥,因此密钥K的值将永远不会改变。
  • 多个线程同时使用同一映射永远不会导致JVM抛出VirtualMachineError,也不会导致segfault。

请注意,以上某些示例是类本身无法阻止的竞争条件的示例。 “线程安全”不是 保证,如果您使用线程安全类,则程序将摆脱竞争状态。它仅保证类的源代码不会成为程序中与线程相关的错误的原因。

,

当一个实体同时被多个访问者更新或修改时,种族条件就会发生。对于纯粹的读取,没有竞争条件,因为读取与更新或修改不同。


ConcurrentHashMap具有线程安全性,这意味着该DS中可能发生竞争状况的方面已经得到解决。

因此...是的,即使不是ConcurrentHashMap中的所有方法都受到保护,不能进行并发访问,但是ConcurrentHashMap是线程安全的,因为对于那些方法而言,并发访问不是问题。

,
  

但是比赛条件可能会发生,因为(snip)

由于对任何“线程安全”原语(甚至是互斥体)的非平凡使用,根据定义 涉及种族。

如果没有竞争,您甚至不必担心“线程安全”,因为访问将是连续的

,

我会说是的,线程安全意味着没有数据争用的可能性。

因为线程安全性是指:“如果一个数据类型或静态方法在多个线程中正确使用,则无论它们如何执行,只要它们正确运行,并且无需其他协调,从调用代码中。” (MIT,course on Software Construction

种族条件基本上就是线程安全代码中不会发生的事情:“竞争条件是当事件的时间或顺序影响程序的正确性时,会出现的缺陷”。 (John Regehr,University of Utah

,

“线程安全”可能取决于主观解释,尽管“竞赛条件”更为客观。我会尽力解释。

例如,在C ++ cout中,“如此”在其自己的实现级别上是线程安全的。从多个线程并行调用cout时,您不会看到应用崩溃或向单个控制台(共享资源)输出乱码。

但是,如果您使用cout从并行线程输出文本字符串,则在某一时刻您会看到文本在字符序列级别上混乱了,因为无疑正在发生竞争。

这是否意味着cout不是线程安全的?我倾向于“否”,因为C ++标准认为它具有足够的线程安全性(我稍后会再讲)。

这是否意味着您的代码不是线程安全的?这要视情况而定。

如果您和您的代码用户期望输出混合文本片段,那么从用户的角度来看,该代码可以被认为是线程安全的,尽管它具有竞争条件(访问共享资源-控制台-无需同步) )。

但是,如果有人抱怨并且您不得不重写代码,则意味着它被认为不够线程安全。

因此,“不是线程安全的”可能被粗略地定义为“由于竞争条件而导致不良行为”。

如果没有由于种族条件引起的不良行为,则可能取决于主观解释。从用户的角度来看,我想说代码仍然可以被认为是线程安全的,尽管从技术上讲并不是因为它忽略了竞争条件。

返回到控制台输出主题。在.NET中,微软似乎认为C ++的控制台输出还不够线程安全(因此又是主观解释),因此他们以不同的方式实现它,因此您可以将整个字符串输出到Console.Write,而无需混合来自不同线程的文本

向Microsoft报价其.NET控制台:

使用这些流的

I / O操作是同步的,这意味着 多个线程可以从流中读取或写入流。

并引用C ++标准:

并发访问同步(第2.7.5.3.4节)标准iostream 对象的格式化和未格式化输入(第27.7.2.1节)和输出 (§27.7.3.1)函数或多线程的标准C流 不会导致数据争用(第1.10节)。 [注意:用户必须 同步多个对象同时使用这些对象和流 线程,如果他们希望避免交错字符。 ]

因此,C ++认为cout具有足够的线程安全性,即使它具有逻辑竞争条件(可能导致交错字符)也是如此。相比之下,Microsoft认为它不足以达到其目的的线程安全性,因此增加了针对这种竞争条件的保护。

所以这就是为什么我认为“线程安全”是主观的且取决于上下文的,而竞态条件可以更客观地确定您是否要处理它。

本文链接:https://www.f2er.com/3156149.html

大家都在问