The ChannelManager provides a single, static instance of systemCache (code below), which may be used by every instance of ChannelRenderer.Worker and every rendering thread concurrently.
public static final Map<String, ChannelCacheEntry> systemCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT, SYSTEM_CHANNEL_CACHE_MIN_SIZE, .75f, true);
Unfortunately, ReferenceMap (provided by jakarta commons collections) is no thread-safe. We should either (1) wrap the ReferenceMap in Collections.synchronizedMap(); or (2) replace the ReferenceMap with an EhCache-managed map.
NOTE: This issue only affects channels that are cachable and whose cache keys indicate that SYSTEM-scope is in use.
Possible fix for 3.1 or trunk
The ReferenceMap change was made for uPortal 3.0, prior to 3.0 a thread safe Map implementation was used.
Fixed by switching to EhCache instance for shared channel rendering cache
Added uportal-systemChannelCache_3-1-1.patch so that it matches up with the 3.1.1 release.