Java 相当于 .Net 的 Interlocked 类是啥?

Posted

技术标签:

【中文标题】Java 相当于 .Net 的 Interlocked 类是啥?【英文标题】:What's Java's equivalent of .Net's Interlocked class?Java 相当于 .Net 的 Interlocked 类是什么? 【发布时间】:2009-07-20 08:25:05 【问题描述】:

如何在 Java 中以原子方式和线程安全地修改 int?

原子增量、测试和设置等...?

【问题讨论】:

【参考方案1】:

使用AtomicInteger。

【讨论】:

如果您只需要它提供的有限的一组操作,这很好。问题中的“等”表示更灵活。 是吗?如果他在寻找更多,他应该更明确。与此同时,AtomicInteger 似乎是正确的答案 还可以查看 java.util.concurrent 包中的其他类。它们对“etc”-stuff 有帮助【参考方案2】:

线程安全可以通过同步函数来实现。 将您的 int(或此类数据)包装在一个通过同步方法提供所需功能的类中,例如

public class X

  protected int x;
  public synchronized void set( int value )
  
    x = value;
  

您还可以使用 java.util.concurrent.atomic 包中的类,例如AtomicInteger 或 AtomicIntegerArray

为什么这个答案不起作用

我只是想明确指出这个答案有什么问题,以防万一synchronized 可以用来解决线程竞争效应的任何事情

| Thread A      | Thread B         | 
|---------------|------------------|
| read x (x=4)  |                  |
|               | read x (x=4)     |
| Calculate 4+1 |                  |
| EAX ← 5       |                  |
|               | Calculate 4+1    |
|               | EAX ← 5          |
| Start sync    |                  |
|              | Start sync       |
|  x ← 5       |    wait          |
|              |    wait          |
| End sync      |    wait          |
|               |                 | 
|               |  x ← 5          |
|               |                 | 
|               | End sync         |

操作的最终结果:

x = 4;
x += 1;
x += 1;

x = 5 而不是 6。

volatile 关键字也存在同样的问题。 volatile 关键字不会让您摆脱线程效应。 volatile 关键字仅确保

在读取变量之前刷新缓存 写入值后刷新缓存

严格来说,volatile 确保内存操作不会围绕 volatile 变量重新排序。这意味着您仍然会遭受:

从 x 读取 写信给 x

问题。

【讨论】:

Synchronized 的重量相当大,并不能真正作为 Interlocked 的有效替代品。人们使用 Interlocked 是因为它既快速又轻便。【参考方案3】:
private final static AtomicInteger at = new AtomicInteger();

public void run() 
    at.set(7);
    int i = at.incrementAndGet();

【讨论】:

以上是关于Java 相当于 .Net 的 Interlocked 类是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# InterLock保证数据一致性

Java 相当于 .Net 的 Interlocked 类是啥?

java_UDP

.Net Core 真能令微软的.Net 跨平台“蔓延”?

.NET与Java的子串运算性能比较

请问.NET和 JAVA的区别