📜  门| GATE-CS-2017(套装2)|问题 16(1)

📅  最后修改于: 2023-12-03 15:42:19.204000             🧑  作者: Mango

门 GATE-CS-2017(套装2)问题 16

这是 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,我们可以预测以下几种输出的可能性:

  1. 对于每个线程来说,它们都会执行 counter.increment(),也就是都会使计数器加 1,因此输出可能为 1 x,其中 x 可能是 1 或者 2。
  2. 考虑同步 synchronized(counter),这意味着同时只有一个线程可以持有锁,因此两个线程的执行可能是交替的。假设线程 A 先持有锁,执行 counter.increment() 之后输出计数器的值为 1,然后线程 A 释放锁,线程 B 获得锁,执行 counter.increment() 之后输出计数器的值为 2。因此输出也可能为 1 2

根据上述分析,我们可以得到最终输出为 1 2,因此选项 B 是正确的。

答案:B

参考文献
  • GATE-CS-2017(套装 2),问题 16。