Это не домашнее задание для меня, это задача, которую дают студентам какого-то университета. Я интересуюсь решением из личного интереса.
Задача состоит в том, чтобы создать класс (Calc), который хранит целое число. Два метода add и mul должны складывать или умножать это целое число.
Одновременно запускаются два потока. Один поток должен вызвать c.add(3) десять раз, другой - c.mul(3) десять раз (на одном и том же Calc-объекте, конечно).
Класс Calc должен следить за тем, чтобы операции выполнялись поочередно (add, mul, add, mul, add, mul, ...).
Я не часто работал с проблемами, связанными с параллелизмом - еще меньше с Java. Я придумал следующую реализацию для Calc:
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: Сигнатура методов не должна быть изменена. В остальном я не ограничен.