这并不是我的作业,而是来自一些大学分配给学生的任务。我对解决方案感兴趣。
这个任务是创建一个类(Calc),它保存一个整数。两个方法add和mul应该将其加上或乘以这个整数。
同时设置了两个线程。一个线程应该调用c.add(3)十次,另一个线程应该调用c.mul(3)十次(当然是在同一个Calc对象上)。
Calc类应该确保操作交替进行(添加、乘、添加、乘、添加、乘,等等)。
我没有做过很多与并发相关的问题 - 更少的是使用Java。我想出了以下实现方法:
class Calc{
private int sum = 0;
//Is volatile actually needed? Or is bool atomic by default? Or it's read operation, at least.
private volatile bool b = true;
public void add(int i){
while(!b){}
synchronized(this){
sum += i;
b = true;
}
}
public void mul(int i){
while(b){}
synchronized(this){
sum *= i;
b = false;
}
}
}
我想知道我的做法是否正确。而且在 while(b) 部分肯定有更加优雅的方法。
PS:方法的签名不允许更改。除此之外没有其它限制。
b
。太好了,真是太好了。 - Maarten Bodewes