Является ли этот класс java потокобезопасным?

Это не домашнее задание для меня, это задача, которую дают студентам какого-то университета. Я интересуюсь решением из личного интереса.

Задача состоит в том, чтобы создать класс (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: Сигнатура методов не должна быть изменена. В остальном я не ограничен.

10
задан Tudor 23 January 2012 в 17:50
поделиться