The test is just a repeated TestGenericKeyedObjectPool.testThreaded1 with removed sleep in TestThread to maximize contention. ------------------------ JDK6, 20 threads, 50000 loops: previous: time: 2359ms time: 1922ms time: 1907ms time: 1921ms time: 1875ms time: 1860ms time: 1922ms time: 1859ms time: 1922ms time: 2000ms relaxed: time: 1687ms time: 1891ms time: 1859ms time: 1750ms time: 1813ms time: 1797ms time: 1609ms time: 1656ms time: 1719ms time: 1547ms ------------------------ JDK6, 50 threads, 50000 loops: previous: time: 5985ms time: 5781ms time: 5250ms time: 5797ms time: 5031ms time: 5391ms time: 5562ms time: 4906ms time: 4750ms time: 4750ms relaxed: time: 4266ms time: 4297ms time: 4390ms time: 4297ms time: 4516ms time: 4203ms time: 4109ms time: 4141ms time: 4250ms time: 4062ms ------------------------ JDK6, 50 threads, 50000 loops, -server VM: previous: time: 3875ms time: 3453ms time: 3484ms time: 3360ms time: 3390ms time: 3391ms time: 3265ms time: 3250ms time: 3391ms time: 3344ms relaxed: time: 3235ms time: 2921ms time: 3000ms time: 3016ms time: 3094ms time: 3062ms time: 2782ms time: 2640ms time: 3016ms time: 3000ms ------------------------ JDK 1.4.2_13, 50 threads, 50000 loops: previous: time: 33125ms time: 32531ms time: 31844ms time: 32328ms time: 32453ms time: 32500ms time: 32437ms time: 33047ms time: 32735ms time: 32484ms relaxed: time: 34032ms time: 32172ms time: 32312ms time: 27345ms time: 32125ms time: 31406ms time: 31156ms time: 31094ms time: 32047ms time: 31875ms These numbers contain much more "noise" since JDK 1.4 (and JDK 1.5 as well) are much, much slower overall than JDK6; therefore the improvement is less visible. Still the results are reproducible.