gpt4 book ai didi

java - java中多线程的并发

转载 作者:行者123 更新时间:2023-12-01 06:04:03 25 4
gpt4 key购买 nike

我在进行 ocjp 6 考试模拟考试时遇到了以下有关并发访问的问题:

public class Cruiser {
private int a = 0;

public void foo() {
Runnable r = new LittleCruiser();
new Thread(r).start();
new Thread(r).start();
}

public static void main(String arg[]) {
Cruiser c = new Cruiser();
c.foo();
}

public class LittleCruiser implements Runnable {
public void run() {
int current = 0;
for (int i = 0; i < 4; i++) {
current = a;
System.out.print(current + ", ");
a = current + 2;
}
}
}

可能的输出是什么?

选项:

A) 0, 2, 4, 0, 2, 4, 6, 6,

B) 0, 2, 4, 6, 8, 10, 12, 14,

C) 0, 2, 4, 6, 8, 10, 2, 4,

D) 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,

E) 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,

答案是A和B。

我的疑问是,选项A怎么可能是一个可能的输出?我的意思是,如果第一个线程进入它的 run 方法,它将更改 a 的值,如果在第二个线程之间到来,它将获得 a 的更改值,那么为什么数字会重复呢?请解释一下这个问题,先谢谢了!

最佳答案

这是一个可能的场景,其中:

  • a 列是 a 的值。
  • 线程 1 是线程 1 的操作
  • 第一个电流是线程 1 的电流值
  • 线程 2 是线程 2 的操作
  • 第二个电流是线程2的电流值

步骤如下:

a        Thread 1     current     Thread 2    current
----------------------------------------------------------
0 current = 0 0
0 current = 0 0
0 current = a 0
0 current = a 0
0 print curr 0 // Prints 0
2 a = current+2 0
2 current = a 2
2 print current 2 // Prints 0, 2
4 a = current+2 2
4 current = a 4
4 print current 4 // Prints 0, 2, 4
4 print current 0 // Prints 0, 2, 4, 0
2 a = current+2 0
2 current = a 2
2 print current 2 // Prints 0, 2, 4, 0, 2
4 a = current+2 2
4 current = a 4
4 print current 4 // Prints 0, 2, 4, 0, 2, 4
6 a = current+2 4
6 a = current+2 4
6 current = a 6
6 current = a 6
6 print current // Prints 0, 2, 4, 0, 2, 4, 6
6 print current // Prints 0, 2, 4, 0, 2, 4, 6, 6

请注意,这不是唯一可能的情况,因为某些操作可以在线程 1 和线程 2 之间反转(例如最后两对)

关于java - java中多线程的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com