📅  最后修改于: 2023-12-03 15:42:19.204000             🧑  作者: Mango
这是 GATE-CS-2017 套装 2 中的问题 16。该问题主要涉及关于多线程和同步的相关概念。
给定以下 Java 代码:
public class Counter {
private int count = 0;
public void increment() {
count++;
}
public void decrement() {
count--;
}
public int value() {
return count;
}
}
public class UseCounter implements Runnable {
private Counter counter;
public UseCounter(Counter counter) {
this.counter = counter;
}
public void run() {
synchronized(counter) {
counter.increment();
System.out.print(counter.value() + " ");
counter.decrement();
}
}
}
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(new UseCounter(counter));
Thread t2 = new Thread(new UseCounter(counter));
t1.start();
t2.start();
}
}
输出是什么?(假设每个线程在调用 counter.value() 之前都会给 count 加 1 而在调用 counter.value() 之后会给 count 减 1)
A. 0 0
B. 1 2
C. 1 1
D. 2 2
这段程序主要涉及了多线程和同步相关的概念,根据程序的执行顺序和同步关键字 synchronized
,我们可以预测以下几种输出的可能性:
counter.increment()
,也就是都会使计数器加 1,因此输出可能为 1 x
,其中 x 可能是 1 或者 2。synchronized(counter)
,这意味着同时只有一个线程可以持有锁,因此两个线程的执行可能是交替的。假设线程 A 先持有锁,执行 counter.increment()
之后输出计数器的值为 1,然后线程 A 释放锁,线程 B 获得锁,执行 counter.increment()
之后输出计数器的值为 2。因此输出也可能为 1 2
。根据上述分析,我们可以得到最终输出为 1 2
,因此选项 B 是正确的。
答案:B