当前位置: 首页 > 知识库问答 >
问题:

类成员的最小值和最大值

洪飞龙
2023-03-14

我试图了解两个线程是更新的class会员的可能值是什么,当我运行程序时输出总是20,但我想了解为什么它会发生以及什么是mimumum,class会员的最大值

public class TestClass {


public int classMember = 0;
    private void updateCM() {
        for (int i = 0; i < 10; i++) {
            classMember++;
        }
    }
public static void main(String[] args) {

    TestClass mainClass = new TestClass();
    Thread t1 = new Thread(mainClass::updateCM);
    Thread t2 = new Thread(mainClass::updateCM);

    t1.start();
    t2.start();

    while(t1.isAlive() || t2.isAlive()) {}

    System.out.println(mainClass.classMember);
}

}

共有3个答案

巢海
2023-03-14

所有介于10和20(包括10和20)之间的值都是可能的结果。

在最坏的情况下,一个线程的每个增量(不是原子增量,由读内存、增量、写内存组成)都与其他线程交错。

可能的交错(为方便起见,省略了“增加”操作):

Thread1  Thread2
Read 0
         Read 0
Write 1
         Write 1
Read 1
         Read 1
Write 2
         Write 2
Read 2
         Read 2
Write 3
         Write 3
Read 3
         Read 3
Write 4
         Write 4
Read 4
         Read 4
Write 5
Read 5
         Write 5
         Read 5
Write 6
Read 6
         Write 6
         Read 6
Write 7
Read 7
         Write 7
         Read 7
Write 8
Read 8
         Write 8
         Read 8
Write 9
Read 9
         Write 9
         Read 9
         Write 10
Write 10

另一种可能的交错:

Thread1  Thread2
Read 0
         Read 0
         Write 1
         Read 1
         Write 2
         Read 2
         Write 3
         Read 3
         Write 4
         Read 4
         Write 5
         Read 5
         Write 6
         Read 6
         Write 7
         Read 7
         Write 8
         Read 8
         Write 9
         Read 9
         Write 10
Write 1
Read 1
Write 2
Read 2
Write 3
Read 3
Write 4
Read 4
Write 5
Read 5
Write 6
Read 6
Write 7
Read 7
Write 8
Read 8
Write 9
Read 9
Write 10
戴品
2023-03-14

增量不是原子操作,所以每次运行程序时结果可能会不同。在这种情况下,我认为,第一个线程只是在处理器给第二个线程执行操作的时间之前完成了变量值的递增。但是,如果你,例如,启动两个线程,其中第一个会将变量的值递减十亿次,而第二个线程则相反——将其递增十亿次,你会得到一些非常意想不到的东西(当然,如果你不打算让这个变量线程安全的话)。

祁奇略
2023-03-14

我想你需要阅读这个Stackoverflow线程

使多个线程使用并更改同一变量

由于要在同一实例中更新同一变量,因此可能会出现同步问题。对于这种情况,合适的关键字应该是volatile。但是,即使将volatile设置为变量,这也不够,因为实际上不是一个操作,而是三个操作,这使得它不是原子操作。

我也会引用这段话

虽然这会处理内存同步,但它不一定会保护您免受竞争条件的影响。认识到这实际上是3个操作也很重要:获取当前值,增加值,然后再次存储。如果多个线程正在尝试执行此操作,则存在可能导致错过操作的线程争用情况。在这种情况下,您应该使用AtomicInteger类,它包装了一个volatile int字段。它提供了incrementAndGet()等方法,这些方法以线程安全的方式递增该字段。

 类似资料:
  • 问题内容: 我正在寻找python中整数的最小值和最大值。例如,在Java中,我们有和。python中是否有类似的东西? 问题答案: Python 3 在Python 3中,此问题不适用。普通int类型是无界的。 但是,你实际上可能正在寻找有关当前解释器的字长的信息,在大多数情况下,该信息将与机器的字长相同。该信息在Python 3中仍以形式提供,这是一个有符号的单词可以表示的最大值。等效地,它是

  • 主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都

  • 我有一个Java计算问题,其中我得到了一个整数数组: 例如: 3-2-10 0 1 我应该计算出可以从这些整数形成的最小整数和最大三元组是什么。(在这种情况下,最小值=-30,最大值=60) 我最初认为最大值总是正的,最小值总是负的。 因此, 我最初的算法是: 扫描数组并取出其中的3个最大元素,存储到数组中。 同时,取出里面的3个最小的元素,存储到另一个数组中。 通过不等式,我们可以推断如下: v

  • 问题内容: 我的代码没有给出错误,但是没有显示最小值和最大值。代码是: 我是否需要system.out.println()来显示它,否则返回应该起作用吗? 问题答案: 您正在调用方法,但不使用返回的值。

  • 这是一个非常基本的算法(不能再简单了),但我被难住了。我们有一个元素数组,我们必须确定最小值和最大值。 通常的方法是遍历数组,找出最小值和最大值,即2n比较。 稍微有效的方法是首先对数组的连续元素进行比较,以确定任意两个元素的最大值和最小值(N/2比较)。我们现在有n/2 min和n/2 max元素。现在我们可以在n/2+n/2+n/2(前一步)=3/2*n或1.5n中得到最终的max和min 那

  • 这个问题可能是封闭的,因为它听起来很模糊,但我真的问这个,因为我不知道或者我的数学背景不够。 我试图实现一个挑战,其中一部分挑战要求我计算矩阵的最小值和最大值。我对矩阵的实现及其操作没有任何问题,但是什么是矩阵的最小值和最大值?考虑到3x3矩阵是9个数中最小的数,最大的是最大的还是其他什么?