public class JCasHashMap extends Object
The update occurs in the code in JCasGenerated classes, which do: a call to get the value of the map for a key if that is "null", it creates the new JCas cover object, and does a "put" to add the value.
The creation of the new JCas cover object can, in turn, run arbitrary user code, which can result in updates to the JCasHashMap which occur before this original update occurs.
In a multi-threaded environment, multiple threads can do a "get" for the same Feature Structure instance. If it's not in the Map, the correct behavior is:
one of the threads adds the new element the other threads wait for the one thread to finish adding, and then return the object that the one thread added.
The implementation works as follows:
1) The JCasHashMap is split into "n" sub-maps. The number is the number of cores, but grows more slowly as the # of cores > 16. This number can be specified, but this is not currently exposed in the tuning parameters Locking occurs on the sub-maps; the outer method calls are not synchronized 2) The number of sub maps is rounded to a power of 2, to allow the low order bits of the hash of the key to be used to pick the map (via masking). 3) A getReserve that results in not-found returns a null, but adds to the table a special reserved element. 3a) This adding may result in table resizing 4) A getReserve that finds a special reserved element, knows that some other thread is in the process of adding an entry for that key, so it waits. 5) A put, if it finds a reserved-for-that-key element, replaces that with the real element, and then does a notifyAll to wake up any threads that were waiting (on this sub-map), and these threads then re-do the get. Multiple threads could be waiting on this, and they will all wake-up.
All calls are of the getReserved, followed by a put if the getReserved returns null. (Experiment - disabled after no change noted To improve locality of reference, an aux data structure of size to fit in one cache line of a Power7 (128 bytes) caches the latest lookups)
Modifier and Type | Method and Description |
---|---|
void |
clear() |
int |
getConcurrencyLevel() |
FeatureStructureImpl |
getReserve(int key) |
static int |
hashInt(int k1) |
FeatureStructureImpl |
put(FeatureStructureImpl value) |
void |
showHistogram() |
public void clear()
public FeatureStructureImpl getReserve(int key)
public FeatureStructureImpl put(FeatureStructureImpl value)
public static int hashInt(int k1)
public void showHistogram()
public int getConcurrencyLevel()
Copyright © 2006–2021 The Apache Software Foundation. All rights reserved.