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 Modify the addX method using ReentrantLock to get the desired output.
时间: 2023-12-19 09:05:17 浏览: 70
cordic.rar_The Given
To achieve the desired output `x=1 x=2 x=3 x=4`, we can use the `ReentrantLock` class to synchronize the `addX()` method. Here's how we can modify the `Game` class:
```
import java.util.concurrent.locks.ReentrantLock;
class Game {
private static final int DELAY = 500;
private int x;
private ReentrantLock lock;
public Game() {
x = 0;
lock = new ReentrantLock();
}
public void addX() {
lock.lock();
try {
int y = x;
Thread.sleep((int) (DELAY * Math.random()));
y += 1;
x = y;
System.out.println("x=" + x);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
```
In this modified `Game` class, we have added a `ReentrantLock` instance variable named `lock`, and we have used it to synchronize the `addX()` method. The `lock()` method is called to acquire the lock before executing the critical section of the method, and the `unlock()` method is called to release the lock.
With this modification, the output of the program will always be `x=1 x=2 x=3 x=4`.
阅读全文