// Freezable implementation
- private boolean frozen;
+ private volatile boolean frozen;
/**
* @draft ICU 3.6
/*
*******************************************************************************
- * Copyright (C) 2008-2012, International Business Machines Corporation and *
+ * Copyright (C) 2008-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
}
// Freezable stuffs
- private transient boolean isFrozen = false;
+ private transient volatile boolean isFrozen = false;
/* (non-Javadoc)
* @see com.ibm.icu.util.TimeZone#isFrozen()
}
// Freezable stuffs
- private transient boolean isFrozen = false;
+ private transient volatile boolean isFrozen = false;
/* (non-Javadoc)
* @see com.ibm.icu.util.TimeZone#isFrozen()
/*
**********************************************************************
- * Copyright (c) 2002-2011, Google, International Business Machines
+ * Copyright (c) 2002-2014, Google, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Author: Mark Davis
public class Row<C0, C1, C2, C3, C4> implements java.lang.Comparable, Cloneable,
Freezable<Row<C0, C1, C2, C3, C4>>{
protected Object[] items;
- protected boolean frozen;
+ protected volatile boolean frozen;
/**
* Convenience Methods
/*
*******************************************************************************
- * Copyright (C) 2011-2013, International Business Machines Corporation and *
+ * Copyright (C) 2011-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
private ULocale _locale;
private TimeZoneNames _tznames;
- private transient boolean _frozen;
+ private transient volatile boolean _frozen;
private transient String _region;
private transient WeakReference<LocaleDisplayNames> _localeDisplayNamesRef;
private transient MessageFormat[] _patternFormatters;
// HashMap( skeleton, HashMap(largest_different_field, pattern) )
private Map<String, Map<String, PatternInfo>> 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
* @stable ICU 4.4
*/
public DateIntervalInfo freeze() {
- frozen = true;
fIntervalPatternsReadOnly = true;
+ frozen = true;
return this;
}
private char defaultHourFormatChar = 'H';
//private boolean chineseMonthHack = false;
//private boolean isComplete = false;
- private boolean frozen = false;
+ private volatile boolean frozen = false;
private transient DateTimeMatcher current = new DateTimeMatcher();
private transient FormatParser fp = new FormatParser();
private boolean hasArgNames;
private boolean hasArgNumbers;
private boolean needsAutoQuoting;
- private boolean frozen;
+ private volatile boolean frozen;
private static final ApostropheMode defaultAposMode=
ApostropheMode.valueOf(
/*
*******************************************************************************
-* Copyright (C) 2011-2013, International Business Machines
+* Copyright (C) 2011-2014, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* created on: 2011jul14
return this;
}
- private List<MessageContentsNode> list = new ArrayList<MessageContentsNode>();
+ private volatile List<MessageContentsNode> list = new ArrayList<MessageContentsNode>();
}
/**
private MessagePattern.ArgType argType;
private double offset;
private boolean explicitOffset;
- private List<VariantNode> list = new ArrayList<VariantNode>();
+ private volatile List<VariantNode> list = new ArrayList<VariantNode>();
}
/**
private transient String _region;
- private transient boolean _frozen;
+ private volatile transient boolean _frozen;
private transient volatile TimeZoneNames _tzdbNames;
*/
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
//----------------------------------------------------------------
/*
******************************************************************************
- * Copyright (C) 2005-2011, International Business Machines Corporation and *
+ * Copyright (C) 2005-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
******************************************************************************
*/
* </p>
*
* <pre>
- * protected boolean immutable;
+ * protected volatile boolean frozen; // WARNING: must be volatile
* </pre>
*
* <p>
* };
*
* public A freeze() {
- * frozen = true;
+ * frozen = true; // WARNING: must be final statement before return
* return this;
* }
* </pre>
* fields frozen, and set the frozen flag. Any subsequent getter/setter will
* work properly. Here is an example:
* </p>
- *
+ * <p><b>Warning!</b> The 'frozen' boolean MUST be volatile, and must be set as the last statement
+ * in the method.</p>
* <pre>
* public A freeze() {
* if (!frozen) {
}
- private boolean frozen = false;
+ private volatile boolean frozen = false;
public ScoreData freeze() {
return this;
}
}
- private boolean frozen = false;
+ private volatile boolean frozen = false;
/**
* {@inheritDoc}
}
// Freezable stuffs
- private transient boolean isFrozen = false;
+ private volatile transient boolean isFrozen = false;
/**
* {@inheritDoc}
}
// Freezable stuffs
- private transient boolean isFrozen = false;
+ private volatile transient boolean isFrozen = false;
/**
* {@inheritDoc}
}
// Freezable stuffs
- private transient boolean isFrozen = false;
+ private volatile transient boolean isFrozen = false;
/**
* {@inheritDoc}
/*
*******************************************************************************
- * Copyright (C) 2008-2013, International Business Machines Corporation and *
+ * Copyright (C) 2008-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
}
// Freezable stuffs
- private transient boolean fIsFrozen = false;
+ private volatile transient boolean fIsFrozen = false;
@Override
public boolean isFrozen() {
/*
**********************************************************************
- * Copyright (c) 2002-2012, International Business Machines
+ * Copyright (c) 2002-2014, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
* Author: Mark Davis
return this;
}
- boolean frozen = false;
+ volatile boolean frozen = false;
public boolean isFrozen() {
return frozen;
public Object freeze() {
if (!frozen) {
- frozen = true;
// does not handle one level down, so we do that on a case-by-case basis
for (K key : data.keySet()) {
data.put(key, Collections.unmodifiableSet(data.get(key)));
}
// now do top level
data = Collections.unmodifiableMap(data);
+ frozen = true;
}
return this;
}
private transient boolean staleAvailableValues;
private transient boolean errorOnReset;
- private transient boolean locked;
+ private volatile transient boolean locked;
private int lastIndex;
private Map<String,T> stringMap;