Depends on if you want to go by the javadoc or not - it says that if *any* of the threads accessing the map concurrently make a structural change, the map must be synchronized. It's clear that get does not make a structural change when using insertion order, but can any other threads possibly make a mapping change while calling get? Sounds like yes, and so the contract would seem to indicate you synchronize...

Put can modify shared variables that get accesses - sounds like dangerous ground to me. If it works, its got to be sneaky enough to warrant code smell...

- Mark

Shalin Shekhar Mangar (JIRA) wrote:
[ https://issues.apache.org/jira/browse/SOLR-665?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12617490#action_12617490 ]
Shalin Shekhar Mangar commented on SOLR-665:
--------------------------------------------

I think Fuad has a point. In an Insertion ordered LinkedHashMap, get makes no 
structural modification and if we synchronize put/remove, we should be fine. 
The cache warming is already thread-safe and we don't have iterators anywhere. 
Am I missing something here?

FIFO Cache (Unsynchronized): 9x times performance boost
-------------------------------------------------------

                Key: SOLR-665
                URL: https://issues.apache.org/jira/browse/SOLR-665
            Project: Solr
         Issue Type: Improvement
   Affects Versions: 1.3
        Environment: JRockit R27 (Java 6)
           Reporter: Fuad Efendi
        Attachments: FIFOCache.java

  Original Estimate: 672h
 Remaining Estimate: 672h

Attached is modified version of LRUCache where 1. map = new LinkedHashMap(initialSize, 0.75f, false) - so that "reordering"/true (performance bottleneck of LRU) is replaced to "insertion-order"/false (so that it became FIFO)
2. Almost all (absolutely unneccessary) synchronized statements commented out
See discussion at 
http://www.nabble.com/LRUCache---synchronized%21--td16439831.html
Performance metrics (taken from SOLR Admin):
LRU
Requests: 7638
Average Time-Per-Request: 15300
Average Request-per-Second: 0.06
FIFO:
Requests: 3355
Average Time-Per-Request: 1610
Average Request-per-Second: 0.11
Performance increased 9 times which roughly corresponds to a number of CPU in a 
system, http://www.tokenizer.org/ (Shopping Search Engine at Tokenizer.org)
Current number of documents: 7494689
name: filterCache class: org.apache.solr.search.LRUCache version: 1.0 description: LRU Cache(maxSize=10000000, initialSize=1000) stats: lookups : 15966954582
hits : 16391851546
hitratio : 0.102
inserts : 4246120
evictions : 0
size : 2668705
cumulative_lookups : 16415839763
cumulative_hits : 16411608101
cumulative_hitratio : 0.99
cumulative_inserts : 4246246
cumulative_evictions : 0 Thanks


Reply via email to