当前位置 > 主页 > 万和大讲堂 >


Java单例问题解析_南京Java培训

2015-07-20 09:59

  这个问题由最开始使用JACKSONJSON而衍生出来,因为官网上建议将ObjectMapper作为全局变量使用从而提高效率,所以,我们项目里面使用了单例,在使用单例的时候,我们无可厚非的考虑了资源在使用时是否要保证互斥的情况。南京Java培训


  最开始的写法:


  Java代码


  publicfinalclassJacksonJsonMapper{


  staticvolatileObjectMapperobjectMapper=null;


  privateJacksonJsonMapper(){}


  publicstaticObjectMappergetInstance(){


  if(objectMapper==null){


  objectMapper=newObjectMapper();


  }


  returnobjectMapper;


  }


  }


  在此期间,我考虑了两个问题,并与团队中的另外一个兄弟发生了激烈的讨论:


  1、在使用getInstance()方法的时候,是否要使用synchronized关键字。南京Java培训


  2、在使用objectMapper.writeValueAsString(object)时,因为此方法非静态方法,在此方法内是否会使用到对象自有的属性,而在并发的时候出现前者属性被后者覆盖的问题。


  后再看了源码后,排除了第二个顾虑,ObjectMapper是与线程绑定的,所以是线程安全的,并且也在官网的线程安全介绍中得到了证实。


  Jacksonfollowsthread-safetyrulestypicalformodernfactory-basedJavadataformathandlers(similartowhat,say,StaxorJAXPimplementationsdo).Forexample:


  Factories(ObjectMapper,JsonFactory)arethread-safeonceconfigured:soensurethatallconfigurationisdonefromasinglethread,andbeforeinstantiatinganythingwithfactory.


  Reader/writerinstances(likeJsonParserandJsonParser)arenotthread-safe--thereisusuallynoneedforthemtobe,butifforsomereasonyouneedtoaccessthemfrommultiplethreads,externalsynchronizationisneeded


  Alltransformerobjects(customserializers,deserializers)areexpectedtobestateless,andtherebythreadsafe--statehastobestoredsomewhereoutsideinstances(inThreadLocalorcontextobjectspassedin,likeDeserializationContext).


  第一个顾虑在看完下面这篇文章后,得到了解决方法:


  Java代码


  publicfinalclassJacksonJsonMapper{


  staticvolatileObjectMapperobjectMapper=null; 南京Java培训


  privateJacksonJsonMapper(){}


  publicstaticObjectMappergetInstance(){


  if(objectMapper==null){


  synchronized(ObjectMapper.class){


  if(objectMapper==null){


  objectMapper=newObjectMapper();


  }


  }


  }


  returnobjectMapper;


  }


  }


  文章中详细说明了关键字volatile是在读取所申明的对象时,会要从内存中进行同步,但是不会对写时起作用,所以,还是需要synchronized关键字的配合。学Java软件开发,来江苏万和计算机培训中心


最近开班 more>
  • 全栈开发
  • 前端基础班
  • 软件测试
  • Java大数据开发工程师
  • 云原生精英班
  • 云网预科班
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCA
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 考试计划
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 10月16日
  • 10月14日
  • 10月9日
  • 10月30日
  • 10月21日
  • 10月8日10月8日
  • 10月28日
  • 10月21日
  • 10月8日
  • 随时开课
  • 11月10日
  • 11月25日
  • 10月28日
  • 10月14日
  • 11月2日
  • 10月26日
  • 10月26日
  • ——
  • 随时开课
  • ——
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入