[
https://issues.apache.org/jira/browse/WW-5121?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Lukasz Lenart updated WW-5121:
------------------------------
Fix Version/s: 2.6
2.5.27
> Contention when injecting Scope.SINGLETON instances
> ---------------------------------------------------
>
> Key: WW-5121
> URL: https://issues.apache.org/jira/browse/WW-5121
> Project: Struts 2
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.5.20
> Reporter: Pascal Davoust
> Priority: Major
> Fix For: 2.5.27, 2.6
>
> Attachments: image-2021-03-22-09-13-03-703.png
>
>
> The container injection (DI) mechanism shows high contention when injecting
> {{Scope.SINGLETON}} instances under high stress load in an enterprise
> application using Struts 2.5.20.
> The symptom is that UI response times vary from a few dozens of milliseconds
> up to a full second without any obvious reason.
> Profiling the app while under load stress using
> [https://github.com/jvm-profiling-tools/async-profiler] (using the {{lock}}
> mode and {{--reverse}} option to aggregate on the various contention code
> locations) shows the following picture:
> !image-2021-03-22-09-13-03-703.png|width=975,height=117!
> Analyzing the code path shows the highly contended code:
> {code:java}
> SINGLETON {
> @Override
> <T> InternalFactory<? extends T> scopeFactory(Class<T> type, String
> name, final InternalFactory<? extends T> factory) {
> return new InternalFactory<T>() {
> T instance;
> public T create(InternalContext context) {
> synchronized (context.getContainer()) {
> if (instance == null) {
> instance =
> InitializableFactory.wrapIfNeeded(factory).create(context);
> }
> return instance;
> }
> }
> ...
> },{code}
> The fully {{synchronised}} section for accessing the singleton instance is
> the core issue here.
>
> Using the double-null-check-on-volatile pattern (which I dislike but is
> reliable since Java 1.5 with the {{volatile}} keyword) entirely removes the
> contention issue and response times become much more stable.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)