📜  门| GATE-CS-2015(套装1)|第 44 题(1)

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

题目介绍

本题来自于 GATE-CS-2015 套装1 中的第44道题,考察了多线程编程中的同步问题。

题目描述

有一个计数器对象,包含一个计数器 count 和两个方法 increment()decrement()increment() 方法将计数器的值增加 $1$,decrement() 方法将计数器的值减少 $1$。

现在有两个线程 A 和 B,它们对计数器对象同时调用 increment()decrement() 方法。希望设计一个同步机制,使得线程 A 和 B 的操作可以正确地更新计数器对象中计数器 count 的值。

需要完成的任务

请你完成以下任务:

  • 分析描述,给出一种符合要求的同步机制。
  • 使用你提出的同步机制,设计一个 Java 类 Counter,实现上述功能。
建议时间

建议用时:$45$ 分钟。

难度等级

中等。

同步机制介绍

对于本题,可以使用 synchronized 锁机制来达到同步的目的。synchronized 可以保证同一时间只有一个线程进入被同步的代码块,其他线程只能等待。

在该题的方法 increment()decrement() 中,使用 synchronized(this) 代码块可以实现同步。

同样,在 Counter 类的构造函数中,可以使用 synchronized(this) 代码块,保证了在创建对象时只有一个线程可以进行操作。

代码片段如下:

class Counter {
    private int count;

    public Counter() {
        synchronized(this) {
            count = 0;
        }
    }

    public void increment() {
        synchronized(this) {
            count++;
        }
    }

    public void decrement() {
        synchronized(this) {
            count--;
        }
    }

    public int getCount() {
        synchronized(this) {
            return count;
        }
    }
}

总结

本题考察了多线程编程的同步问题,以及使用 synchronized 来达到同步的目的。对于使用 synchronized 的同步机制,需要注意加锁的范围,尽量保证加锁的代码块不会出现竞争的情况。

在实现时,需要在适当的地方加入 synchronized(this) 代码块,防止多线程访问计数器对象时出现问题。