I've created this ticket for this: https://issues.apache.org/jira/browse/WICKET-7002
And a PR: https://github.com/apache/wicket/pull/532 Martijn On Fri, Sep 2, 2022 at 2:37 PM Martijn Dashorst <martijn.dasho...@gmail.com> wrote: > Well, > > I think that the metadata storage in Application tries to mimic a > key-value store, but does so in an esoteric way that requires > synchronization, which is unnecessary when we just use a ConcurrentHashMap > for the datastructure that is especially designed for this use case. > Changing the array to a ConcurrentHashMap will not increase the memory > footprint in any meaningful way, but will remove the need for > synchronization and change the algorithm for looking up a value by key from > O(n) to O(1) ( > https://stackoverflow.com/questions/559839/big-o-summary-for-java-collections-framework-implementations > ). > > The change is completely encapsulated for external users (unless they play > with the internals using reflection) so this can also be backported to > Wicket 9, 8 and 7, up til Wicket 1.5 if we so desire (we don't but you get > my drift). > > I also think it is a bad idea to return the datastructure from the setter. > This would have made this optimization impossible to do in a backwards > compatible way. > > Martijn > > > On Fri, Sep 2, 2022 at 11:59 AM Andrea Del Bene <an.delb...@gmail.com> > wrote: > >> It's of course a delicate topic and it needs a full investigation, but >> looking at the code of both setMetaData and getMetaData I think we could >> reduce the synchronization overloading by making Application#metadata >> volatile and removing synchronized from getMetaData. In addition I think >> setMetaData should always return a new copy of Application#metadata to >> ensure a proper synchronization among threads, but I'm not 100% sure about >> this. >> >> Just some 2 cents... >> >> On Fri, Sep 2, 2022 at 8:46 AM Martijn Dashorst < >> martijn.dasho...@gmail.com> >> wrote: >> >> > Heya! >> > >> > In a performance dump for a production issue I was looking through the >> > monitors that were in use during request processing and I noticed that a >> > lot of request threads were blocking on Application.getMetaData. >> > >> > This method is synchronized because it uses an array of metadata and >> goes >> > through that array in search of the key. >> > >> > I'm no rocket scientist, but shouldn't that metadata field just be a >> > ConcurrentHashMap so we can remove the blocking synchronization on the >> > application object? >> > >> > Martijn >> > >> > <http://wicketinaction.com> >> > >> >> >> -- >> Andrea Del Bene. >> Apache Wicket committer. >> > > > -- > Become a Wicket expert, learn from the best: http://wicketinaction.com > -- Become a Wicket expert, learn from the best: http://wicketinaction.com