Tutorial

ConcurrentHashMap in Java

Published on August 4, 2022
author

Pankaj

ConcurrentHashMap in Java

Java ConcurrentHashMap class is part of the Concurrency Collection Classes. It’s a hash table implementation, which supports concurrent retrieval and updates. It’s used in a multi-threaded environment to avoid ConcurrentModificationException.

ConcurrentHashMap

If we try to modify the collection while iterating over it, we get ConcurrentModificationException. Java 1.5 introduced Concurrent classes in the java.util.concurrent package to overcome this scenario. ConcurrentHashMap is the Map implementation that allows us to modify the Map while iteration. The ConcurrentHashMap operations are thread-safe. ConcurrentHashMap doesn’t allow null for keys and values.

Java ConcurrentHashMap Example

The ConcurrentHashMap class is similar to HashMap, except that it’s thread-safe and allows modification while iteration.

package com.journaldev.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {

	public static void main(String[] args) {

		//ConcurrentHashMap
		Map<String,String> myMap = new ConcurrentHashMap<String,String>();
		myMap.put("1", "1");
		myMap.put("2", "1");
		myMap.put("3", "1");
		myMap.put("4", "1");
		myMap.put("5", "1");
		myMap.put("6", "1");
		System.out.println("ConcurrentHashMap before iterator: "+myMap);
		Iterator<String> it = myMap.keySet().iterator();

		while(it.hasNext()){
			String key = it.next();
			if(key.equals("3")) myMap.put(key+"new", "new3");
		}
		System.out.println("ConcurrentHashMap after iterator: "+myMap);

		//HashMap
		myMap = new HashMap<String,String>();
		myMap.put("1", "1");
		myMap.put("2", "1");
		myMap.put("3", "1");
		myMap.put("4", "1");
		myMap.put("5", "1");
		myMap.put("6", "1");
		System.out.println("HashMap before iterator: "+myMap);
		Iterator<String> it1 = myMap.keySet().iterator();

		while(it1.hasNext()){
			String key = it1.next();
			if(key.equals("3")) myMap.put(key+"new", "new3");
		}
		System.out.println("HashMap after iterator: "+myMap);
	}

}

Output:

ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
	at java.util.HashMap$KeyIterator.next(HashMap.java:828)
	at com.test.ConcurrentHashMapExample.main(ConcurrentHashMapExample.java:44)

It’s clear from the output that ConcurrentHashMap takes care of the new entry in the map while iteration whereas HashMap throws ConcurrentModificationException. Let’s look at the exception stack trace closely. The following statement has thrown Exception.

String key = it1.next();

It means that the new entry got inserted in the HashMap but Iterator is failing. Actually, Iterator on Collection objects is fail-fast i.e any modification in the structure or the number of entries in the collection object will trigger the exception.

How does iterator know about the modification in the Collection?

We have taken the set of keys from HashMap and then iterating over it. HashMap contains a variable to count the number of modifications and iterator use it when you call its next() function to get the next entry. HashMap.java:

/**
     * The number of times this HashMap has been structurally modified
     * Structural modifications are those that change the number of mappings in
     * the HashMap or otherwise modify its internal structure (e.g.,
     * rehash).  This field is used to make iterators on Collection-views of
     * the HashMap fail-fast.  (See ConcurrentModificationException).
     */
    transient volatile int modCount;

Let’s change the code a little bit to come out of the iterator loop when we insert the new entry. All we need to do is add a break statement after the put call.

if(key.equals("3")){
	myMap.put(key+"new", "new3");
	break;
}

The output with the above code:

ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
HashMap after iterator: {3=1, 2=1, 1=1, 3new=new3, 6=1, 5=1, 4=1}

What happens if the key value is modified?

What if we don’t add a new entry but update the existing key-value pair? Will it throw exception? Let’s change the code in the original program and check it out.

//myMap.put(key+"new", "new3");
myMap.put(key, "new3");

There won’t be any exception because the collection is modified but its structure remains the same.

Further Reading

Did you notice those angle brackets while creating our collection object and Iterator? It’s called generics and it’s very powerful when it comes to type-checking at compile time to remove ClassCastException at runtime. Learn more about generics in Java Generics Example. You should also read Java Collections Interview Questions and Iterator Design Pattern in Java.

You can checkout more Java collection examples from our GitHub Repository.

Reference: API Doc

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the author(s)

Category:
Tutorial

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
August 11, 2011

As a website resource for companies and engineering enthusiasts to comply with the newest and greatest breakthroughs in Unified Communications, IP Telephony, Hosted Communications and VoIP.

- internet

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    December 15, 2011

    Odd behaviour, the result of the last modification comes out as HashMap after iterator: {3=new3, 2=1, 1=1, 6=1, 5=1, 4=1}

    - Khalid

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      May 21, 2012

      defnetly we get confused about Output. Can you Explain more reagarding the above Program…When we adding the element first time it provides an Exception…But When you have Written “Map.put(key, “new3”);” this line it doesnt provide any error.Explain it in better way…

      - Ashok singh

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      October 17, 2012

      If you use myMap.put(key, “new3”); its actually modifying key value, so there is no structural modification in the HashMap. Output will be: ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1} ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1} HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1} HashMap after iterator: {3=new3, 2=1, 1=1, 6=1, 5=1, 4=1}

      - Pankaj

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        December 1, 2012

        Excellent! Clears the concept and the usage of ConcurrentHashMap Thanks

        - Rajeev

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          August 5, 2013

          I have added code to remove one item from map. the item is removed from map. But when its iterating it is printing the key and with value as null. Does that mean iterator has that key even though map does not have it? Does iterator will have a copy of keys? Below is modified code: while(it.hasNext()){ String key = it.next(); System.out.println("Key "+key+"value: "+myMap.get(key)); if(key.equals(“3”)) { myMap.put(key+“new”, “new3”); myMap.remove(“4”); System.out.println("while iterating: "+myMap); } } System.out.println("ConcurrentHashMap after iterator: "+myMap); ouput is: ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1} Key 1 value: 1 Key 5 value: 1 Key 6 value: 1 Key 3 value: 1 while iterating: {1=1, 3new=new3, 5=1, 6=1, 3=1, 2=1} Key 4 value: null Key 2 value: 1 ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 2=1}

          - Sravanthi

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          August 5, 2013

          This is the expected behavior, when you get the iterator from Map then it has all the keys including “4”, now when you remove it, its removed from the HashMap but not from the iterator that you have already got, so its returning NULL.

          - Pankaj

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          August 5, 2013

          Thanks for the quick answer. So Iterator has separate memory with key copies?

          - Sravanthi

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            March 5, 2014

            i have one doubt in this … when ever we remove one value it is removed from HashMap but not Iteratior k fine… but we are printing only HashMap object on console even though why that Null values came for removed object…

            - Ramana Reddy

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              December 17, 2013

              For the key “4” : while(it1.hasNext()){ String key = it1.next(); if(key.equals(“4”)){ myMap.put(key+“new”, “new4”); } } Output: Got no ConcurrentModificationException occured… HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1} HashMap after iterator: {3=1, 2=1, 1=1, 4new=new4, 6=1, 5=1, 4=1} How???

              - Nazeer Khan

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              February 23, 2014

              Hi, I am getting the same issue. We are getting error with 3, but not with 4. Could you please explain? Why?

              - Pankaj Chopra

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              February 23, 2014

              I think I got the answer. The issue here is, the key=“4” is in the last in Hash Map HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1} So, after comparing with “4”, and adding a new key-Value pair “4new”=“new4”, its done with the processing of iterator. As the error is thrown in next call to iterator.next(), so in this case, we are not getting any error. You can check in all other cases you will get the error. Please correct me, if my understanding is incorrect.

              - Pankaj Chopra

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              March 28, 2014

              We can have a better understanding if we Use Integer as keys //HashMap Map myMap1 = new HashMap(); myMap1.put(1, “1”); myMap1.put(2, “1”); myMap1.put(3, “1”); myMap1.put(4, “1”); myMap1.put(5, “1”); myMap1.put(6, “1”); System.out.println("HashMap before iterator: "+myMap1); Iterator it1 = myMap1.keySet().iterator(); while(it1.hasNext()){ Integer key = it1.next(); if(key.equals(6)) {myMap1.put(7, “new3”); } } System.out.println("HashMap after iterator: "+myMap1);

              - Abhishek Sunandan

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                March 3, 2014

                Nicely explained. can you please tell why there is no exception when we are try to change the value but not key. //myMap.put(key+“new”, “new3”); myMap.put(key, “new3”); do we have seperate “modCount” for key and value in map. but how it is getting a updated value?

                - Devendra

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                March 3, 2014

                modCount is for key only, since we are not changing the structure of the map the exception is not thrown. You are seeing updates value because we are printing the HashMap and not the iterator values.

                - Pankaj

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                June 1, 2015

                This is the nice tutorial…100/100

                - arif khan

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  April 2, 2014

                  Thanks, nice post

                  - Binh Thanh Nguyen

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    April 15, 2014

                    Nicely compiled article. Understood the concept quickly. Thank you.

                    - Ankit Tripathi

                      JournalDev
                      DigitalOcean Employee
                      DigitalOcean Employee badge
                      May 26, 2014

                      if u are breaking from while when key is 3 then how could it print the remaining values in while loop if(key.equals(“3”)){ myMap.put(key+“new”, “new3”); break; } ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1} ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1} HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1} HashMap after iterator: {3=1, 2=1, 1=1, 3new=new3, 6=1, 5=1, 4=1} The output should be ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1} ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1} HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1} HashMap after iterator: {3=1, 2=1, 1=1, 3new=new3} Please clarify

                      - nikhil

                      JournalDev
                      DigitalOcean Employee
                      DigitalOcean Employee badge
                      March 27, 2015

                      If you observe carefully he is not displaying value in while loop… print is last statement…

                      - prakash

                        JournalDev
                        DigitalOcean Employee
                        DigitalOcean Employee badge
                        August 11, 2014

                        The above example is good. I have tried to explain the same using multiple threads trying to add data to HashMap. https://www.javavisited.com/2014/04/internal-working-of-hashmap\_15.html and https://www.javavisited.com/2014/04/internal-working-of-concurrenthashmap.html Please check this website for a demo of what I have mentioned above. Please correct me if my understanding is wrong somewhere.

                        - Ganesh Rashinker

                          JournalDev
                          DigitalOcean Employee
                          DigitalOcean Employee badge
                          August 28, 2014

                          i had gone through so many web sites, but no one has given clear definition, but finally i got complete clarity on this point. thanks brother.

                          - nawaz

                            JournalDev
                            DigitalOcean Employee
                            DigitalOcean Employee badge
                            November 5, 2014

                            HI Very good explantion,its very helpfull to me. Thanks

                            - Ramakrisha

                              JournalDev
                              DigitalOcean Employee
                              DigitalOcean Employee badge
                              January 7, 2015

                              Its really good explanation…Thanks…

                              - sunil

                                JournalDev
                                DigitalOcean Employee
                                DigitalOcean Employee badge
                                January 27, 2015

                                Really helpfull,while attending the inrerviews…It is good !

                                - NARAYANA

                                  JournalDev
                                  DigitalOcean Employee
                                  DigitalOcean Employee badge
                                  April 23, 2015

                                  Excellent example about concurenthashmap and concurentmodified exception

                                  - Ram

                                    JournalDev
                                    DigitalOcean Employee
                                    DigitalOcean Employee badge
                                    May 11, 2015

                                    Really this tutorial is awesome. Thanks for sharing this. Regards, Chandu.

                                    - Chandrasekhar G

                                      JournalDev
                                      DigitalOcean Employee
                                      DigitalOcean Employee badge
                                      May 29, 2015

                                      greate example …superb

                                      - husenbadshah goundi

                                        JournalDev
                                        DigitalOcean Employee
                                        DigitalOcean Employee badge
                                        June 19, 2015

                                        every time when get a iterator .the operation underlying is : public Iterator iterator() { return new Itr(); } private class Itr implements Iterator { int expectedModCount = modCount; … } then every mutative operation , thr modcount will be modCount++; that’s why when modCount changed ,but expectedModCount was initialized when iterator(),and not changed after. if (modCount != expectedModCount) throw new ConcurrentModificationException();

                                        - mr_rookie

                                          JournalDev
                                          DigitalOcean Employee
                                          DigitalOcean Employee badge
                                          October 22, 2015

                                          really awesome

                                          - Anil Gupta From Sidhi Mp

                                          JournalDev
                                          DigitalOcean Employee
                                          DigitalOcean Employee badge
                                          October 22, 2015

                                          thanks for giving this type of deeply knowledge ,

                                          - Anil Gupta From Sidhi Mp

                                            JournalDev
                                            DigitalOcean Employee
                                            DigitalOcean Employee badge
                                            October 14, 2016

                                            Great example ,nice explaination,Thanks for sharing.

                                            - Rupa

                                              JournalDev
                                              DigitalOcean Employee
                                              DigitalOcean Employee badge
                                              February 9, 2017

                                              Excellent example

                                              - narayana

                                                JournalDev
                                                DigitalOcean Employee
                                                DigitalOcean Employee badge
                                                April 12, 2017

                                                Map hm= new ConcurrentHashMap(); hm.put(“1”,1); hm.put(“2”,2); hm.put(“3”,3); System.out.println(hm); Iterator it = hm.keySet().iterator(); while(it.hasNext()){ String key = it.next(); if(key.equals(“3”)) hm.put(“3”,4); } System.out.println(hm); System.out.println(“+++++++++++++++++++++++++++++++++++”); hm= new HashMap(); hm.put(“1”,1); hm.put(“2”,2); hm.put(“3”,3); System.out.println(hm); Iterator it1 = hm.keySet().iterator(); while(it.hasNext()){ String key = it1.next(); if(key.equals(“3”)) hm.put(“3”,4); } System.out.println(hm); O/P is //concurrent hash map {1=1, 2=2, 3=3} {1=1, 2=2, 3=4} +++++++++++++++++++++++++++++++++++ //hashmap {1=1, 2=2, 3=3} {1=1, 2=2, 3=3} *Note :- I am using java 8 . is cocncurrent HashpMap example is handeled

                                                - Tejas

                                                  JournalDev
                                                  DigitalOcean Employee
                                                  DigitalOcean Employee badge
                                                  July 12, 2017

                                                  Hi , I have checked this example in our eclipse and it was working in HashMap class too . public class ConcurrentHashMapExample { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try{ HashMap map = new HashMap(); map.put(“One”, “I am one”); map.put(“Two”,“I am two”); System.out.println(“Map is returned in first”+map); Iterator itr= map.keySet().iterator(); while(itr.hasNext()){ String key=itr.next(); System.out.println(“Traversing value”+key); if(“One”.equals(key)) map.put(key+“OneOne”, “I am Eleven”); System.out.println(“Map is returned in last”+map); } } catch(Exception e){ e.printStackTrace(); } Output is : Map is returned in first{Two=I am two, One=I am one} Traversing valueTwo Map is returned in last{Two=I am two, One=I am one} Traversing valueOne Map is returned in last{OneOneOne=I am Eleven, Two=I am two, One=I am one} In case of remove the element from hashmap ,It will showing the exception .Kindly correct the logic here

                                                  - Vikas Kumar

                                                    JournalDev
                                                    DigitalOcean Employee
                                                    DigitalOcean Employee badge
                                                    November 24, 2017

                                                    Not getting output as HashMap after iterator: {3=1, 2=1, 1=1, 3new=new3, 6=1, 5=1, 4=1} After adding break after put in hashMap. it is as HashMap after iterator: {1=1, 2=1, 3=1, 4=1, 5=1, 6=1}

                                                    - Anand Maheshwari

                                                      JournalDev
                                                      DigitalOcean Employee
                                                      DigitalOcean Employee badge
                                                      February 9, 2018

                                                      Really Excellent Explain

                                                      - Bipil Raut

                                                        JournalDev
                                                        DigitalOcean Employee
                                                        DigitalOcean Employee badge
                                                        August 21, 2018

                                                        Here, where you are using count variable.

                                                        - Krishna

                                                          JournalDev
                                                          DigitalOcean Employee
                                                          DigitalOcean Employee badge
                                                          August 21, 2018

                                                          If we are updating existing key value pair,exception will not come. By using break statement inside if loop, ConcurrentModificationException is resolving. How it is happening by inserting simple break.

                                                          - Krishna

                                                            JournalDev
                                                            DigitalOcean Employee
                                                            DigitalOcean Employee badge
                                                            February 12, 2019

                                                            everybody comes here only everytime before the interview :)

                                                            - haider raza

                                                              JournalDev
                                                              DigitalOcean Employee
                                                              DigitalOcean Employee badge
                                                              December 27, 2019

                                                              Reached many students.Great content.

                                                              - vellaivaranan

                                                                Try DigitalOcean for free

                                                                Click below to sign up and get $200 of credit to try our products over 60 days!

                                                                Sign up

                                                                Join the Tech Talk
                                                                Success! Thank you! Please check your email for further details.

                                                                Please complete your information!

                                                                Become a contributor for community

                                                                Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                                                                DigitalOcean Documentation

                                                                Full documentation for every DigitalOcean product.

                                                                Resources for startups and SMBs

                                                                The Wave has everything you need to know about building a business, from raising funding to marketing your product.

                                                                Get our newsletter

                                                                Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

                                                                New accounts only. By submitting your email you agree to our Privacy Policy

                                                                The developer cloud

                                                                Scale up as you grow — whether you're running one virtual machine or ten thousand.

                                                                Get started for free

                                                                Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

                                                                *This promotional offer applies to new accounts only.