Peter Levart - 2010-09-24

I tried enclosed tests of various Counters on i3 530 CPU (2 cores, 4 threads) with Linux 2.6.32.21 (Fedora 12) using 64bit JDK_1.6.0_u23-b01 and got the following results for 1 … 4 concurrent threads:

==== Counter  Threads   Trial:      0          1          2          3          4          5          6        Average
===      Racey    1  cnts/sec=  174582154  172331506  174543437  169797305  172630640  176269573  172631384  173343824 (+/- 0%)
=== Synchroniz    1  cnts/sec=  150224074   40323011   40302822   40046079   40137587   40210296   39858442   40203959 (+/- 0%)
===       Lock    1  cnts/sec=   41800010   42176995   42688922   41417759   41880942   41890417   42081903   41966053 (+/- 0%)
===     Atomic    1  cnts/sec=   97321080   99035295   99994441   97948600   96548048   96502927   96983510   97567306 (+/- 0%)
===     Unsafe    1  cnts/sec=   95654076   96647880   98033608   99634414   96931043   98900675   97995096   97701660 (+/- 0%)
===     Locks8    1  cnts/sec=   42245350   42522368   43264504   43460192   43717578   43639354   43498521   43276987 (+/- 1%)
===   Unsafes8    1  cnts/sec=   90509422   89159348   88034754   88833596   89220516   88718540   86318425   88793350 (+/- 1%)
===    Locks64    1  cnts/sec=   42297247   41488534   41198220   43214971   43124756   42117236   42955847   42396724 (+/- 1%)
===  Unsafes64    1  cnts/sec=   89864962   89640970   87093285   89093586   87579167   88029178   88589504   88586481 (+/- 0%)
===   Locks256    1  cnts/sec=   43251196   43166971   42471052   43524552   42090851   43017135   41957039   42799441 (+/- 1%)
=== Unsafes256    1  cnts/sec=   90135282   88594385   84825765   85864439   90111458   85463215   88729280   87752555 (+/- 2%)
===        CAT    1  cnts/sec=   65465072   65297659   66086961   65903432   63835001   65776610   65222028   65532960 (+/- 0%) autotable=4

===      Racey    2  cnts/sec=  128883320  127184027  120205525  174069280  126343980  131054720  129061745  128505558 (+/- 1%)  Lossage=34%
=== Synchroniz    2  cnts/sec=   13027752   12886771   12593047   12907497   13261349   11741289   11954280   12673869 (+/- 3%)
===       Lock    2  cnts/sec=    8395723    6812267    7014704    6759235    6989208    7443996    7068110    7065657 (+/- 3%)
===     Atomic    2  cnts/sec=   31937137   30874855   31022211   30434022   30846262   33499313   32137057   31363504 (+/- 1%)
===     Unsafe    2  cnts/sec=   31625173   32179171   32005418   32565285   31966302   31983351   31036366   31951883 (+/- 1%)
===     Locks8    2  cnts/sec=   21084536    9178211   18261025   21502774   22862184   27517642    7644833   18577746 (+/-29%)
===   Unsafes8    2  cnts/sec=  163470332   50263216  166117667   51944040  166160913  165682810  165290308  142501031 (+/-35%)
===    Locks64    2  cnts/sec=   52653927   52685244   52304573   53224481    8210129   52606674   52074458   52464975 (+/- 0%)
===  Unsafes64    2  cnts/sec=  164359698  149042499  166001770   50724033   51453207  165663172  164692145  139042144 (+/-35%)
===   Locks256    2  cnts/sec=   52899891   53055855   40609142   81217212   48357365   82221242   45799032   56265871 (+/-25%)
=== Unsafes256    2  cnts/sec=  168276262  155333254  163560928  156469718  165599918   49172630  166737152  161540194 (+/- 3%)
===        CAT    2  cnts/sec=   42492510   43595010   42529424   42136975  124316905  124247647  121787665   74930451 (+/-58%) autotable=32

===      Racey    3  cnts/sec=  107665245  107613222  107554640  107489699  106624690  105933888  108420183  107389499 (+/- 0%)  Lossage=32%
=== Synchroniz    3  cnts/sec=   12659833   12955152   13495288   12862205   12417548   12565035   12901410   12788727 (+/- 1%)
===       Lock    3  cnts/sec=   25421409   25525911   25263660   25658832   26315497   24743606   25255355   25425033 (+/- 0%)
===     Atomic    3  cnts/sec=   40466024   40229925   41524133   40772651   41377516   40903343   40448405   40793587 (+/- 0%)
===     Unsafe    3  cnts/sec=   29473844   28932083   28765839   30040765   29600018   29251665   28587641   29204689 (+/- 1%)
===     Locks8    3  cnts/sec=   14688433   19526585   17455927   29560512   23799844   17653716   27649120   21217038 (+/-20%)
===   Unsafes8    3  cnts/sec=   40521202  146536710  125687358   58480251   55423687   50263573   32466038   66075214 (+/-55%)
===    Locks64    3  cnts/sec=   60754228   61547197   62515697   60329581   60504048   58383639   60511137   60729238 (+/- 0%)
===  Unsafes64    3  cnts/sec=  188769431  187287238  173712626  187042222  186287932  187214960  189798719  187320356 (+/- 0%)
===   Locks256    3  cnts/sec=   61404559   47677137   61900587   59829155   59807018   51824031   24245384   56108380 (+/-28%)
=== Unsafes256    3  cnts/sec=  172165694  179076371  182470845  185248642  188199978  176829721  103478799  179158254 (+/-19%)
===        CAT    3  cnts/sec=  141011528  136192352  141655642  140510363  141128489   77652182  124366567  136641859 (+/- 5%) autotable=1048576

===      Racey    4  cnts/sec=   94025616   94459126   90501794   95256139   94334092   95284307   92107312   94036457 (+/- 1%)  Lossage=32%
=== Synchroniz    4  cnts/sec=   11017771   11068765   11513973   10989585   11192265   10642630   10968810   11047439 (+/- 0%)
===       Lock    4  cnts/sec=   30231202   30032748   28026965   26484092   29463922   28584743   34863873   29267916 (+/- 3%)
===     Atomic    4  cnts/sec=   30761897   29545098   28133071   30476227   29801007   30674069   30122017   30123683 (+/- 1%)
===     Unsafe    4  cnts/sec=   32737541   31661982   30161838   31592804   33390566   32163137   32205390   32072170 (+/- 1%)
===     Locks8    4  cnts/sec=   47130129   27328840   29901784   29586629   25161070   32429166   39374268   31724137 (+/-14%)
===   Unsafes8    4  cnts/sec=  115947804  180882936  105780325   72180768   60903892  158988721  113088480  113197219 (+/-27%)
===    Locks64    4  cnts/sec=   71792081   34648289   88048657   57618637   48478239   60226142   78962496   63415519 (+/-18%)
===  Unsafes64    4  cnts/sec=  190884092  193742534  190100152  167265300   85238445  114576122  196290517  171313640 (+/-19%)
===   Locks256    4  cnts/sec=   70589306   62749642   55894570   70973688   67874402   71074676   59688189   66375045 (+/- 7%)
=== Unsafes256    4  cnts/sec=  192896171  199087743  198525414  196480958  191121824  189160610  200151034  195622422 (+/- 1%)
===        CAT    4  cnts/sec=   77581061  151831959  146813847  150717267   99802179  105543897  149705964  130516630 (+/-19%) autotable=1048576

as can be seen, when number of concurrent threads is 3 or 4, CAT expands to max. size (1M entries). I don't think this is expected behavior. Is it possible that hash codes of threads are stumbling on the same entry? Would using some kind of random generator instead of hash work better? Is it, performance wise, necessary that the same thread always updates the same entry?