<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Race hazard in DefaultDeploymentCache? in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150787#M105611</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Let's say we have the following two threads:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"runner" prio=10 tid=0x00007fa5b850b800 nid=0x120c runnable [0x00007fa59befd000]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; java.lang.Thread.State: RUNNABLE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at java.util.HashMap.get(HashMap.java:419)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DefaultDeploymentCache.get(DefaultDeploymentCache.java:57)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DeploymentManager.resolveProcessDefinition(DeploymentManager.java:108)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedLatestProcessDefinitionByKey(DeploymentManager.java:77)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:72)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:37)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:62)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at activiti.Main2$2.run(Main2.java:51)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"deployer" prio=10 tid=0x00007fa5b850a800 nid=0x120a runnable [0x00007fa59bffe000]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; java.lang.Thread.State: RUNNABLE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at java.util.HashMap.put(HashMap.java:491)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DefaultDeploymentCache.add(DefaultDeploymentCache.java:61)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy(BpmnDeployer.java:229)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DeploymentManager.deploy(DeploymentManager.java:50)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.DeployCmd.execute(DeployCmd.java:80)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.DeployCmd.execute(DeployCmd.java:35)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.RepositoryServiceImpl.deploy(RepositoryServiceImpl.java:78)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.repository.DeploymentBuilderImpl.deploy(DeploymentBuilderImpl.java:156)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at activiti.Main2$1.run(Main2.java:41)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The runner thread is starting processes, the deployer thread deploy new processes. Both threads access the same DefaultDeploymentCache instance, therfore they simultaneously read and write the same HashMap. If two thread read and write the HashMap at the same time, it could happen the linked list in the HashMap become to a linked cirle, so the one of the Thread would never exit from the linked list traversion loop.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Note that the example above is not an actual thread stuck. I put breakpoints in the HashMap to demonstrate how the call stack would look like.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 14 Apr 2014 18:47:02 GMT</pubDate>
    <dc:creator>zmb</dc:creator>
    <dc:date>2014-04-14T18:47:02Z</dc:date>
    <item>
      <title>Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150785#M105609</link>
      <description>Hi all,First of all, sorry for my english, I'm not a native speaker.While I were playing with Activiti, I noticed the deployment cache is just a HashMap. I digged into the code of Activiti, but I didn't find any synchonization when the code access the cache. My experience, and the javadoc of the Has</description>
      <pubDate>Sat, 12 Apr 2014 13:31:25 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150785#M105609</guid>
      <dc:creator>zmb</dc:creator>
      <dc:date>2014-04-12T13:31:25Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150786#M105610</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;When would it create a stuck thread exactly?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best regards,&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 Apr 2014 07:49:20 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150786#M105610</guid>
      <dc:creator>trademak</dc:creator>
      <dc:date>2014-04-14T07:49:20Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150787#M105611</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Let's say we have the following two threads:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"runner" prio=10 tid=0x00007fa5b850b800 nid=0x120c runnable [0x00007fa59befd000]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; java.lang.Thread.State: RUNNABLE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at java.util.HashMap.get(HashMap.java:419)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DefaultDeploymentCache.get(DefaultDeploymentCache.java:57)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DeploymentManager.resolveProcessDefinition(DeploymentManager.java:108)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedLatestProcessDefinitionByKey(DeploymentManager.java:77)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:72)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:37)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:62)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at activiti.Main2$2.run(Main2.java:51)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"deployer" prio=10 tid=0x00007fa5b850a800 nid=0x120a runnable [0x00007fa59bffe000]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; java.lang.Thread.State: RUNNABLE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at java.util.HashMap.put(HashMap.java:491)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DefaultDeploymentCache.add(DefaultDeploymentCache.java:61)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy(BpmnDeployer.java:229)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.persistence.deploy.DeploymentManager.deploy(DeploymentManager.java:50)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.DeployCmd.execute(DeployCmd.java:80)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cmd.DeployCmd.execute(DeployCmd.java:35)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.RepositoryServiceImpl.deploy(RepositoryServiceImpl.java:78)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at org.activiti.engine.impl.repository.DeploymentBuilderImpl.deploy(DeploymentBuilderImpl.java:156)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; at activiti.Main2$1.run(Main2.java:41)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The runner thread is starting processes, the deployer thread deploy new processes. Both threads access the same DefaultDeploymentCache instance, therfore they simultaneously read and write the same HashMap. If two thread read and write the HashMap at the same time, it could happen the linked list in the HashMap become to a linked cirle, so the one of the Thread would never exit from the linked list traversion loop.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Note that the example above is not an actual thread stuck. I put breakpoints in the HashMap to demonstrate how the call stack would look like.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 14 Apr 2014 18:47:02 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150787#M105611</guid>
      <dc:creator>zmb</dc:creator>
      <dc:date>2014-04-14T18:47:02Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150788#M105612</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;It sounds like a very edge case. What would be a good solution to solve this in your opinion?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best regards,&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 16 Apr 2014 14:20:37 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150788#M105612</guid>
      <dc:creator>trademak</dc:creator>
      <dc:date>2014-04-16T14:20:37Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150789#M105613</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Agree, it's indeed an edge case. I think replacing the HashMap to a ConcurrentHashMap would be a good solution.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 16 Apr 2014 18:27:12 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150789#M105613</guid>
      <dc:creator>zmb</dc:creator>
      <dc:date>2014-04-16T18:27:12Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150790#M105614</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;That would indeed solve that issue …. but im afraid of the runtime impact on performance. Altough, probably gets from the concurrent hashmap are not synchronized?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 22 Apr 2014 10:49:31 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150790#M105614</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2014-04-22T10:49:31Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150791#M105615</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;The internet is full with concurrentmap performance tests, you can decide what performance penalty it has.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 26 Apr 2014 17:19:47 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150791#M105615</guid>
      <dc:creator>zmb</dc:creator>
      <dc:date>2014-04-26T17:19:47Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150792#M105616</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Not synchronized access to HashMap in most cases leads to endless loop (I've observed this problem previously in jbpm).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This time it caused null key in LinkedHashMap so org.activiti.engine.impl.persistence.deploy.DefaultDeploymentCache could not evict last entry and consumed whole heap.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;See this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;15:04:31,658 TRACE [org.activiti.engine.impl.persistence.deploy.DefaultDeploymentCache] (pool-12-thread-19177) Cache limit is reached, null will be evicted&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 05 Jun 2014 13:53:08 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150792#M105616</guid>
      <dc:creator>grzechu</dc:creator>
      <dc:date>2014-06-05T13:53:08Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150793#M105617</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;How is it possible that a null key is inserted? That should not be possible at all.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best regards,&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 06 Jun 2014 10:53:50 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150793#M105617</guid>
      <dc:creator>trademak</dc:creator>
      <dc:date>2014-06-06T10:53:50Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150794#M105618</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi. There is a problem with cache on multithreaded environment and we're suffering memory leaks because of that.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Following 50 lines of code explain why there should be no discussion about weather to synchronize (or not) access to LinkedHashMap. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;java&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;import java.util.Collections;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;import java.util.LinkedHashMap;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;import java.util.Map;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;public class TestMapCache implements Runnable {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static class CacheMap extends LinkedHashMap&amp;lt;String, String&amp;gt; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final static long serialVersionUID = 1L;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final static int MAX_ENTRIES = 20;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String name;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CacheMap(String name) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name = name;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected boolean removeEldestEntry(java.util.Map.Entry&amp;lt;String, String&amp;gt; eldest) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return size() &amp;gt; MAX_ENTRIES;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String toString() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "Cache " + name + " size is " + size();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static Map&amp;lt;String, String&amp;gt; cache1 = Collections.synchronizedMap(new CacheMap("sync_cache"));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static Map&amp;lt;String, String&amp;gt; cache2 = new CacheMap("not_sync_cache");&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) throws InterruptedException {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread[] threads = new Thread[] {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(new TestMapCache()),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(new TestMapCache()),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Thread(new TestMapCache()) };&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(cache1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(cache2);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Thread t : threads)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.start();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Thread t : threads)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.join();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(cache1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(cache2);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void run() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 10000; i++) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cache1.put("time" + System.nanoTime(), "x");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cache2.put("time" + System.nanoTime(), "x");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/java&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Cache sync_cache size is 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Cache not_sync_cache size is 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Cache sync_cache size is 20&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Cache not_sync_cache size is 18721&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 10 Jun 2014 10:15:49 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150794#M105618</guid>
      <dc:creator>tomsko</dc:creator>
      <dc:date>2014-06-10T10:15:49Z</dc:date>
    </item>
    <item>
      <title>Re: Race hazard in DefaultDeploymentCache?</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150795#M105619</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;@tomsko: lol … that's pretty clear. I'll update the code.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 17 Jun 2014 20:55:25 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/race-hazard-in-defaultdeploymentcache/m-p/150795#M105619</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2014-06-17T20:55:25Z</dc:date>
    </item>
  </channel>
</rss>

