📅  最后修改于: 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
的值。
请你完成以下任务:
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) 代码块,防止多线程访问计数器对象时出现问题。