json - JSONObject.fromObject cause java.util.ConcurrentModificationException -


when check server error log, found

net.sf.json.jsonexception: java.util.concurrentmodificationexception     @ net.sf.json.jsonobject.defaultbeanprocessing(jsonobject.java:818)     @ net.sf.json.jsonobject._frombean(jsonobject.java:699)     @ net.sf.json.jsonobject.fromobject(jsonobject.java:172)     @ net.sf.json.jsonobject.fromobject(jsonobject.java:134)     @ com.j1.mai.model.common.jsonresult.tostring(jsonresult.java:126)     @ com.j1.mai.model.common.jsonpbaseaction.write(jsonpbaseaction.java:84)     @ com.j1.mai.model.common.jsonpbaseaction.write(jsonpbaseaction.java:65)     @ com.j1.mai.action.searchaction.list(searchaction.java:106)     @ sun.reflect.generatedmethodaccessor325.invoke(unknown source)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25)     @ java.lang.reflect.method.invoke(method.java:597)     @ org.springframework.web.bind.annotation.support.handlermethodinvoker.invokehandlermethod(handlermethodinvoker.java:176)     @ org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter.invokehandlermethod(annotationmethodhandleradapter.java:440)     @ org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter.handle(annotationmethodhandleradapter.java:428)     @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:925)     @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:856)     @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:936)     @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:827)     @ javax.servlet.http.httpservlet.service(httpservlet.java:617)     @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:812)     @ javax.servlet.http.httpservlet.service(httpservlet.java:723)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:290)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206)     @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:88)     @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206)     @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:233)     @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:191)     @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:127)     @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:103)     @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:109)     @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:293)     @ org.apache.coyote.http11.http11aprprocessor.process(http11aprprocessor.java:879)     @ org.apache.coyote.http11.http11aprprotocol$http11connectionhandler.process(http11aprprotocol.java:617)     @ org.apache.tomcat.util.net.aprendpoint$worker.run(aprendpoint.java:1774)     @ java.lang.thread.run(thread.java:662) caused by: java.util.concurrentmodificationexception     @ java.util.abstractlist$itr.checkforcomodification(abstractlist.java:372)     @ java.util.abstractlist$itr.next(abstractlist.java:343)     @ org.apache.commons.collections.iterators.abstractiteratordecorator.next(abstractiteratordecorator.java:67)     @ org.apache.commons.collections.map.listorderedmap$listorderediterator.next(listorderedmap.java:605)     @ net.sf.json.jsonobject.hashcode(jsonobject.java:2114)     @ java.util.hashmap.put(hashmap.java:372)     @ java.util.hashset.add(hashset.java:200)     @ net.sf.json.abstractjson.addinstance(abstractjson.java:63)     @ net.sf.json.jsonobject._fromjsonobject(jsonobject.java:900)     @ net.sf.json.jsonobject.fromobject(jsonobject.java:155)     @ net.sf.json.jsonserializer.tojson(jsonserializer.java:108)     @ net.sf.json.abstractjson._processvalue(abstractjson.java:238)     @ net.sf.json.jsonobject._processvalue(jsonobject.java:2655)     @ net.sf.json.jsonobject.processvalue(jsonobject.java:2721)     @ net.sf.json.jsonobject.setinternal(jsonobject.java:2736)     @ net.sf.json.jsonobject.setvalue(jsonobject.java:1424)     @ net.sf.json.jsonobject.defaultbeanprocessing(jsonobject.java:765)     ... 36 more 

the jsonresult class

public class jsonresult implements serializable {     static logger log = logger.getlogger(jsonresult.class);      private static final long serialversionuid = 248463127163578297l;      private string status;     private string msg;     private jsonobject data;      public jsonresult() {         this.setsuccess();         this.data = new jsonobject();     }      public string getstatus() {         return status;     }      public jsonresult setstatus(string status) {         this.status = status;         return this;     }      public jsonresult setsuccess() {         this.status = msgstatus.normal.getcode();         return this;     }      public jsonresult setfailure() {         this.status = msgstatus.exception.getcode();         return this;     }      public string getmsg() {         return msg;     }      public jsonresult setmsg(string msg) {         this.msg = msg;         return this;     }      public jsonobject getdata() {         return data;     }      public boolean success() {         return this.status.equals(msgstatus.normal.getcode());     }      public jsonresult setdata(jsonobject data) {         this.data = data;         return this;     }      public jsonresult put(object key, object val) {         if (val != null)             this.data.put(key, val);         return this;     }      public jsonresult setobjdata(object o) {         if (o == null)             return this;         try {             if (o.getclass().equals(jsonobject.class)) {                 this.data = (jsonobject) o;             } else {                 this.data = jsonobject.fromobject(o);             }         } catch (exception e) {             log.error(e.getmessage(), e);         }         return this;     }      public jsonresult putobjdata(object o) {         if (o == null)             return this;         jsonobject jo = null;         try {             if (o.getclass().equals(jsonobject.class)) {                 jo = (jsonobject) o;             } else {                 jo = jsonobject.fromobject(o);             }             if (jo != null)                 this.data.putall(jo);         } catch (exception e) {             log.error(e.getmessage(), e);         }         return this;     }      public jsonresult clear() {         this.getdata().clear();         this.setsuccess();         this.setmsg("");         return this;     }      @override     public string tostring() {         return jsonobject.fromobject(this).tostring();     } } 

and jsonpbaseaction.write code

protected jsonresult _result = new jsonresult();  public void write(httpservletrequest request, httpservletresponse response,         string callback) {     response.setcontenttype("text/html;charset=utf-8");     response.setcharacterencoding("utf-8");     string result = null;     printwriter writer = null;     try {         writer = response.getwriter();         if (stringutil.isempty(callback))             result = _result.tostring();         else             result = callback + "(" + _result.tostring() + ")";     } catch (exception e) {         logger.error(e.getmessage(), e);     } {         if (writer != null) {             writer.write(result);             writer.close();         }         if (result != null)             _result.clear();     } } 

i think didn't modify jsonobject while write.

why concurrentmodificationexception?

instances of jsonobject not thread-safe. see documentation.


as can see code:

the write method called multiple threads , alters _result, causes exception.