równoległa sprawa nie działa, ponieważ nie używać zmiennych lotnych stąd nie zapewniające widoczność pisze i dlatego masz wiele wątków, które wykonaj następujące czynności:
- czytać
sum
do rejestru
- dodać do rejestru o wartości
sum
zapisze zaktualizowaną wartość z powrotem do pamięci
If 2 wątki zrobić pierwszy krok 1 o ne po drugiej, a następnie wykonaj pozostałe kroki powyżej w dowolnej kolejności, w końcu nadpisują jedną z aktualizacji.
- Użyj adnotacji
@volatile
, aby zapewnić widoczność sum
podczas robienia czegoś takiego. Zobacz here.
- Nawet z
@volatile
, ze względu na brak atomowości przyrostu, będziesz tracić kilka przyrostów. Powinieneś użyć AtomicInteger
s i ich incrementAndGet
.
- Chociaż użycie liczników atomowych zapewni poprawność, posiadanie wspólnych zmiennych znacznie utrudnia wydajność - twoja współdzielona zmienna jest teraz wąskim gardłem wydajności, ponieważ każdy wątek będzie próbował atomowo zapisywać do tej samej linii pamięci podręcznej. Jeśli pisałeś do tej zmiennej nieczęsto, nie byłoby to problemem, ale ponieważ robisz to w każdej iteracji, tutaj nie będzie przyspieszenia - w rzeczywistości, z powodu przeniesienia własności cache-line pomiędzy procesorami, prawdopodobnie będzie wolniej .
Tak więc, jak zasugerował Daniel - użyj do tego celu reduce
.
Nie, efekty uboczne są złe. Jeśli nie masz stanu, znacznie trudniej jest mieć warunki wyścigowe. – PlexQ