我应该使用静态字段并互锁在一起吗?

Posted

技术标签:

【中文标题】我应该使用静态字段并互锁在一起吗?【英文标题】:Should I use static fields and interlocked together? 【发布时间】:2012-10-20 12:53:44 【问题描述】:

我是否应该使用静态字段并互锁在一起,以防我需要使用静态字段提供线程安全和原子操作,静态字段默认是原子的吗?例如:

Interlocked.Increment(ref Factory.DefectivePartsCount);

谢谢。

【问题讨论】:

【参考方案1】:

是的。

字段(假设为 Int32)是原子的,不是因为它是静态的,而是因为它是 32 位。

然而,Factory.DefectivePartsCount += 1 需要对变量执行读取和写入操作,因此整个操作不是线程安全的。

【讨论】:

什么是 32 位(32 位操作系统 - windows?)。如果我将使用 64 位系统,操作将是完全原子的吗? 是的,当您以 64 位为目标时,Int64 也将是原子的。但为什么要依赖它呢?请注意,只有 单个 操作是原子的。【参考方案2】:

static 不保证任何线程安全。因此,即使变量是static,增量仍然不是原子的。因此,您仍然需要根据情况使用经典的同步机制。在你的情况下Interlocked.Increment 很好。

【讨论】:

以上是关于我应该使用静态字段并互锁在一起吗?的主要内容,如果未能解决你的问题,请参考以下文章

您可以将@Autowired 与静态字段一起使用吗?

易失性与互锁性与锁定性

用于增加/模仿布尔值的互锁,这安全吗?

我们可以在 Java 中将两种字体样式组合在一起吗?

我可以使用 VS2010 PrivateObject 访问静态类中的静态字段吗?

在静态方法中使用匿名 Lamba 订阅事件会导致内存泄漏吗?