Currently CPortletAdapter getMarkup() (quoted here from 2-5-patches) is synchronized. Since the 2-5-patches CPortletAdapter is an IMultithreaded, it is a singleton. Therefore, getting portlet markup is globally synchronized. This means that the heavy lifting of portlet rendering is being undertaken under a single thread model -- only one uPortal thread can be rendering a portlet at any given time. This should have serious negative performance consequences for uPortal deployers making heavy use of JSR-168s -- exacerbated by
UP-1423 (portlet "instance" provisioning synchronizes on this same lock, so no portlet instance can be provisioned concurrently with any portlet's rendering).
/**
* This is where we do the real work of getting the markup.
* This is called from both renderXML() and renderCharacters().
* @param uid a unique ID used to identify the state of the channel
* @return markup representing channel content
*/
protected synchronized String getMarkup(String uid) throws PortalException {