Search code examples
javamultithreadinghashmapvolatile

Volatile HashMap Not Updating Outside of Thead


so I have a HashMap that is declared in class level like so:

private static volatile HashMap<String, ArrayList>String>> map =
     new HashMap<String, ArrayList>String>>();

I have several threads updating the same map and the threads are declared in the class level like so:

private class UpdateThread extends Thread {
        @Override
        public void run() {
            // update map here
            // map actually gets updated here
        }
}

But after the threads exit:

for (FetchSKUsThread thread : listOfThreads) {
        thread.start();
}
for (FetchSKUsThread thread : listOfThreads) {
        try {
           thread.join();
           // map not updated anymore :-[
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
 }


Why are the map changes that are occuring inside the thread not persisting after the thread is done? I've decalred the map static and volatile already...

Thanks in advance


Solution

  • Why are the map changes that are occurring inside the thread not persisting after the thread is done? I've declared the map static and volatile already...

    It depends highly on how you are updating the map.

    // update map here -- what's happening here?
    

    As @Louis points out, if multiple threads are updating the same map instance, volatile won't help you and you should be using a ConcurrentHashMap. As @Gerhard points out, volatile is only protecting the updating of the HashMap reference and not the innards of the map itself. You need to fully lock the map if the threads are updating it in parallel or use a concurrent map.

    However, if each thread is replacing the map with a new map then the volatile method would work. Then again, each thread may be overwriting the central map because of race conditions.

    If you show us your update code, we should be able to explain it better.