Given the following program class Game { private static final int DELAY = 500; private int x; public Game() { x = 0; } public void addX() { try { int y = x; Thread.sleep((int) (DELAY * Math.random())); y += 1; x = y; System.out.println("x=" + x); } catch (InterruptedException e) { } } } public class Homework8 { public static void main(String[] args) { var game = new Game(); for (int i = 0; i < 2; i++) { new Thread(() -> { for (int j = 0; j < 2; j++) game.addX(); }).start(); } } } The output could be x=1 x=1 x=2 x=2 or x=1 x=2 x=1 x=2 However, we desire the output to be x=1 x=2 x=3 x=4
时间: 2023-12-19 11:05:17 浏览: 61
To achieve the desired output `x=1 x=2 x=3 x=4`, we need to synchronize the `addX()` method to ensure that only one thread can access it at a time. We can use the `synchronized` keyword to achieve this.
Here is the modified `Game` class:
```
class Game {
private static final int DELAY = 500;
private int x;
public Game() {
x = 0;
}
public synchronized void addX() {
try {
int y = x;
Thread.sleep((int) (DELAY * Math.random()));
y += 1;
x = y;
System.out.println("x=" + x);
} catch (InterruptedException e) {
}
}
}
```
In this modified `Game` class, the `addX()` method is synchronized using the `synchronized` keyword. This ensures that only one thread can execute the method at a time.
With this modification, the output of the program will always be `x=1 x=2 x=3 x=4`.
阅读全文