From: Mark Davis Date: Fri, 29 Aug 2014 14:45:47 +0000 (+0000) Subject: ICU-10467 Fix the freezables with volatile. X-Git-Tag: milestone-59-0-1~1669 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8380296252813af292710bd965bc1a7dc441e7f;p=icu ICU-10467 Fix the freezables with volatile. X-SVN-Rev: 36288 --- diff --git a/icu4j/main/classes/collate/src/com/ibm/icu/util/GlobalizationPreferences.java b/icu4j/main/classes/collate/src/com/ibm/icu/util/GlobalizationPreferences.java index d233fe5a25e..9ea6dcea89e 100644 --- a/icu4j/main/classes/collate/src/com/ibm/icu/util/GlobalizationPreferences.java +++ b/icu4j/main/classes/collate/src/com/ibm/icu/util/GlobalizationPreferences.java @@ -1476,7 +1476,7 @@ public class GlobalizationPreferences implements Freezable implements java.lang.Comparable, Cloneable, Freezable>{ protected Object[] items; - protected boolean frozen; + protected volatile boolean frozen; /** * Convenience Methods diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneGenericNames.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneGenericNames.java index e1c60830e91..7ddf1b00d51 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneGenericNames.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneGenericNames.java @@ -1,6 +1,6 @@ /* ******************************************************************************* - * Copyright (C) 2011-2013, International Business Machines Corporation and * + * Copyright (C) 2011-2014, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ @@ -107,7 +107,7 @@ public class TimeZoneGenericNames implements Serializable, Freezable _localeDisplayNamesRef; private transient MessageFormat[] _patternFormatters; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalInfo.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalInfo.java index 8d15a5ed3c8..9d6bf255c62 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalInfo.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalInfo.java @@ -283,7 +283,7 @@ public class DateIntervalInfo implements Cloneable, Freezable, // HashMap( skeleton, HashMap(largest_different_field, pattern) ) private Map> fIntervalPatterns = null; - private transient boolean frozen = false; + private transient volatile boolean frozen = false; // If true, fIntervalPatterns should not be modified in-place because it // is shared with other objects. Unlike frozen which is always true once @@ -839,8 +839,8 @@ public class DateIntervalInfo implements Cloneable, Freezable, * @stable ICU 4.4 */ public DateIntervalInfo freeze() { - frozen = true; fIntervalPatternsReadOnly = true; + frozen = true; return this; } diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java index 8bee2e64d73..ab196e6009c 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java @@ -1599,7 +1599,7 @@ public class DateTimePatternGenerator implements Freezable list = new ArrayList(); + private volatile List list = new ArrayList(); } /** @@ -391,7 +391,7 @@ public final class MessagePatternUtil { private MessagePattern.ArgType argType; private double offset; private boolean explicitOffset; - private List list = new ArrayList(); + private volatile List list = new ArrayList(); } /** diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java index 874c6b7edb3..f61909efed9 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java @@ -347,7 +347,7 @@ public class TimeZoneFormat extends UFormat implements Freezable private transient String _region; - private transient boolean _frozen; + private volatile transient boolean _frozen; private transient volatile TimeZoneNames _tzdbNames; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java b/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java index f8d24e5313f..7e44d8a2ccc 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java @@ -348,8 +348,8 @@ public class UnicodeSet extends UnicodeFilter implements Iterable, Compa */ private static UnicodeSet INCLUSIONS[] = null; - private BMPSet bmpSet; // The set is frozen if bmpSet or stringSpan is not null. - private UnicodeSetStringSpan stringSpan; + private volatile BMPSet bmpSet; // The set is frozen if bmpSet or stringSpan is not null. + private volatile UnicodeSetStringSpan stringSpan; //---------------------------------------------------------------- // Public API //---------------------------------------------------------------- diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/Freezable.java b/icu4j/main/classes/core/src/com/ibm/icu/util/Freezable.java index 4cf37ddf567..d321c17a1a9 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/Freezable.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/Freezable.java @@ -1,6 +1,6 @@ /* ****************************************************************************** - * Copyright (C) 2005-2011, International Business Machines Corporation and * + * Copyright (C) 2005-2014, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ @@ -158,7 +158,7 @@ package com.ibm.icu.util; *

* *
- * protected boolean immutable;
+ * protected volatile boolean frozen; // WARNING: must be volatile
  * 
* *

@@ -171,7 +171,7 @@ package com.ibm.icu.util; * }; * * public A freeze() { - * frozen = true; + * frozen = true; // WARNING: must be final statement before return * return this; * } * @@ -245,7 +245,8 @@ package com.ibm.icu.util; * fields frozen, and set the frozen flag. Any subsequent getter/setter will * work properly. Here is an example: *

- * + *

Warning! The 'frozen' boolean MUST be volatile, and must be set as the last statement + * in the method.

*
  * public A freeze() {
  *      if (!frozen) {
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
index 62694396dcc..6f3b30653e5 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
@@ -531,7 +531,7 @@ public class LocaleMatcher {
 
         }
 
-        private boolean frozen = false;
+        private volatile boolean frozen = false;
 
         public ScoreData freeze() {
             return this;
@@ -703,7 +703,7 @@ public class LocaleMatcher {
             }
         }
 
-        private boolean frozen = false;
+        private volatile boolean frozen = false;
 
         /** 
          * {@inheritDoc}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/RuleBasedTimeZone.java b/icu4j/main/classes/core/src/com/ibm/icu/util/RuleBasedTimeZone.java
index d24880b4c6f..d79b6717008 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/RuleBasedTimeZone.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/RuleBasedTimeZone.java
@@ -760,7 +760,7 @@ public class RuleBasedTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private volatile transient boolean isFrozen = false;
 
     /**
      * {@inheritDoc}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java b/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
index 335b28a8d1a..27863be5800 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
@@ -1410,7 +1410,7 @@ public class SimpleTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private volatile transient boolean isFrozen = false;
 
     /**
      * {@inheritDoc}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/VTimeZone.java b/icu4j/main/classes/core/src/com/ibm/icu/util/VTimeZone.java
index 7da7bdd784e..bcfbec2d778 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/VTimeZone.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/VTimeZone.java
@@ -2095,7 +2095,7 @@ public class VTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private volatile transient boolean isFrozen = false;
 
     /**
      * {@inheritDoc}
diff --git a/icu4j/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java b/icu4j/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java
index 7bba63772bf..d0fb9d78b71 100644
--- a/icu4j/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java
+++ b/icu4j/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2008-2013, International Business Machines Corporation and    *
+ * Copyright (C) 2008-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -207,7 +207,7 @@ public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean fIsFrozen = false;
+    private volatile transient boolean fIsFrozen = false;
 
     @Override
     public boolean isFrozen() {
diff --git a/icu4j/main/tests/framework/src/com/ibm/icu/dev/util/Relation.java b/icu4j/main/tests/framework/src/com/ibm/icu/dev/util/Relation.java
index 2657a529616..660a93cb199 100644
--- a/icu4j/main/tests/framework/src/com/ibm/icu/dev/util/Relation.java
+++ b/icu4j/main/tests/framework/src/com/ibm/icu/dev/util/Relation.java
@@ -1,6 +1,6 @@
 /*
  **********************************************************************
- * Copyright (c) 2002-2012, International Business Machines
+ * Copyright (c) 2002-2014, International Business Machines
  * Corporation and others.  All Rights Reserved.
  **********************************************************************
  * Author: Mark Davis
@@ -269,7 +269,7 @@ public class Relation implements Freezable { // TODO: add , Map implements Freezable { // TODO: add , Map implements Cloneable, Freezable, StringTransfor
     private transient boolean staleAvailableValues;
 
     private transient boolean errorOnReset;
-    private transient boolean locked;
+    private volatile transient boolean locked;
     private int lastIndex;
     private Map stringMap;