首页 > 解决方案 > 谁能解释一下结果?

问题描述

public class Bank {
    private  int sum=0;

    public void add(int n) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        sum+= n;

        System.out.println(sum);
    }
}


public class Consumer implements Runnable {

    Bank bank = new Bank();
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            bank.add(100);
        } 
    }
}

public class Tes2 {
    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        Thread thread1 = new Thread(consumer);
        Thread thread2 = new Thread(consumer);
        thread1.start();
        thread2.start();
    }
}

这是一个多线程程序,模拟的是多个存款人到银行存钱,用来演示多线程的安全问题。由于代码不同步,所以它的第一个和第二个结果可能是200/200,200/300,等等。但是我不明白为什么你会得到 100/100,谁能解释一下?

标签: javamultithreading

解决方案


这是一个竞争条件。

两个线程都可以访问 sum。

总和 += n; 不是原子的

线程 1 读取总和 0

线程 2 换入,因为代码未同步读取 sum 为 0

线程 1 将 100 添加到 0 并将其写入 sum

线程 2 将 100 添加到 0 并将其写入总和覆盖线程 1s 的值


推荐阅读