Jeszcze jedna notka, która mi wczoraj umknęła.
Wczoraj przy okazji omawiania false-sharing wspomniałem że problemem
jest również bounds-checking (o ile nie zostanie wyeliminowany -- co
ma miejsce w przypadku niektórych pętli). To co wspomniał Stachu
(length jest tylko czytane, więc nie powinno być problemu) jest
prawdą, natomiast jeśli odrobicie zadanie domowe to okaże się, że pole
length dla tablic leży bardzo blisko początkowych elementów... w
związku z tym zaś jeśli wartości w indeksach 0, 1, 2... i inne
początkowe są zapisywane przez jakiś wątek, to inne wątki które
czytają indeksy (nawet te odległe) i robią bounds check będą musiały
zrobić refetch tej linii cache'a na której znajduje się length (bo w
niej siedzą zapisane indeksy 0, 1, 2, ...).
Dla tych, którzy pytali -- projekt disruptor --
http://code.google.com/p/disruptor/
Thread affinity można ustawić przez JNI, np. tutaj jest implementacja:
https://github.com/peter-lawrey/Java-Thread-Affinity
Dawid