java多线程访问原始变量

标签 java multithreading primitive-types

我知道从不同的线程并发访问同一个对象,没有同步,通常是一件坏事。但是这个案例呢:

我有多个线程正在运行(考虑两个,ThreadA 和 ThreadB)。我也有这个静态类来计算线程做某事的次数。

public class Counter {
  static private int counter=0;
  static public void incCounter() {
    counter++;
  }
}

如果 ThreadA 和 ThreadB 都调用 Counter.incCounter() 会发生什么?

最佳答案

这不安全。

每个线程将尝试读取 counter ,加一,写回结果。您不能保证这些读取和写入发生的顺序,或者即使结果对每个线程都是可见的。

特别是,一种失败情况是每个线程读取值 0,将它增加到 1,然后写回值 1。即使在两个线程尝试增加它之后,这也会给计数器的值 1。

考虑使用 AtomicInteger .incrementAndGet() 代替。

关于java多线程访问原始变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311912/

相关文章:

c++ - 什么是线程中的关键部分

Java静态元素被不同的类访问

Java Hibernate 使用Varchar(255) 创建数据库表,如何增加到Varchar(1000)?

c++ - 多线程程序中意外的内存泄漏

IOS递归分派(dispatch)异步

c++ - 关于long long和long double

lisp - ABCL 编译和原语

java - 自定义 IDM 身份验证和授权者

java - 在 Google Apps Marketplace 中使用 java 获取当前用户

java - hsqldb hibernate 持久化@Lob