From f3e50a7624384e325b9fb2c133a887c505308301 Mon Sep 17 00:00:00 2001 From: Diego Gutierrez Yepiz Date: Tue, 20 Feb 2024 22:58:59 +0000 Subject: [PATCH] ICU-22582 Avoid synchronizing in RuleBasedBreakIterator and ULocale unless strictly necessary See #2775 --- .../ibm/icu/text/RuleBasedBreakIterator.java | 36 +++------ .../main/java/com/ibm/icu/util/ULocale.java | 73 +++++++++++-------- 2 files changed, 54 insertions(+), 55 deletions(-) diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/text/RuleBasedBreakIterator.java b/icu4j/main/core/src/main/java/com/ibm/icu/text/RuleBasedBreakIterator.java index d0cf532ec76..9942200795c 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/text/RuleBasedBreakIterator.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/text/RuleBasedBreakIterator.java @@ -19,8 +19,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.text.CharacterIterator; -import java.util.ArrayList; -import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.MissingResourceException; import com.ibm.icu.impl.CharacterIteration; @@ -57,9 +56,6 @@ public class RuleBasedBreakIterator extends BreakIterator { */ private RuleBasedBreakIterator() { fDictionaryCharCount = 0; - synchronized(gAllBreakEngines) { - fBreakEngines = new ArrayList<>(gAllBreakEngines); - } } /** @@ -174,9 +170,6 @@ public class RuleBasedBreakIterator extends BreakIterator { if (fText != null) { result.fText = (CharacterIterator)(fText.clone()); } - synchronized (gAllBreakEngines) { - result.fBreakEngines = new ArrayList<>(gAllBreakEngines); - } result.fLookAheadMatches = new int[fRData.fFTable.fLookAheadResultsSize]; result.fBreakCache = result.new BreakCache(fBreakCache); result.fDictionaryCache = result.new DictionaryCache(fDictionaryCache); @@ -342,23 +335,20 @@ public class RuleBasedBreakIterator extends BreakIterator { * Lazily updated as break engines are needed, because instantiation of * break engines is expensive. * - * Because gAllBreakEngines can be referenced concurrently from different - * BreakIterator instances, all access is synchronized. + * Important notes: + *