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