Это не домашнее задание для меня, это задание для студентов из какого-то университета. Меня интересует решение из личных интересов.
Задача состоит в создании класса (Calc), который содержит целое число. Два метода add и mul должны добавить или умножить это целое число.
Одновременно устанавливаются два потока. Один поток должен называть c.add(3) десять раз, другой должен вызвать c.mul(3) десять раз (на том же самом Calc-объекте, конечно).
Класс Calc должен следить за тем, чтобы операции выполнялись поочередно (add, mul, add, mul, add, mul,..).
Я не работал с concurrency связанными проблемами много - даже с Java. Я придумал следующую реализацию для Calc:
class Calc{
private int sum = 0;
//Is volatile actually needed? Or is bool atomic by default? Or it 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;
}
}
}
Я хотел бы знать, если я на правильном пути здесь. И, конечно же, более элегантный способ до части (б). Я хотел бы услышать мысли ваших ребят.
PS: Подпись методов не должна изменяться. Кроме того, я не ограничен.