To nie jest praca domowa dla mnie, to zadanie dla studentów z jakiejś uczelni. Jestem zainteresowany rozwiązaniem z osobistego interesu.Czy ten wątek klasy Java jest bezpieczny?
Zadanie polega na utworzeniu klasy (Calc), która zawiera liczbę całkowitą. Te dwie metody add i mul powinny dodać lub pomnożyć tę liczbę całkowitą.
Dwa wątki są konfigurowane jednocześnie. Jeden wątek powinien wywoływać c.add (3) dziesięć razy, drugi powinien wywoływać c.mul (3) dziesięć razy (na tym samym obiekcie Calc oczywiście).
Klasa Calc powinna upewnić się, że operacje są wykonywane naprzemiennie (dodaj, mul, dodaj, mul, dodaj, mul, ..).
Nie pracowałem zbyt często z problemami związanymi z konkurencją - jeszcze mniej z Javą. Opracowałem następującą implementację dla 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;
}
}
}
Chciałbym wiedzieć, czy jestem na dobrej drodze. I na pewno jest bardziej elegancki sposób na chwilę (b) część. Chciałbym usłyszeć myśli twoich ludzi.
PS: Podpis metody nie może zostać zmieniony. Poza tym nie jestem ograniczony.
można wykorzystać [AtomicBoolean] (http://docs.oracle.com/javase/6/docs/api/java/util/ concurrent/atomic/AtomicBoolean.html) i [AtomicInteger] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html). – CoolBeans
@AviramSegal - do opracowania: Jest to 1 wątek wywołujący mul() dziesięć razy z rzędu. Nie dziesięć wątków, które wywołują mul(). – s3rius
Wątek bezpieczny, czy nie, każdy, kto używa w ten sposób wartości boolean jako zadania dla uczniów, powinien zostać skasowany. Nazwa pola "b". Świetnie, po prostu świetnie. –